事务策略: 高并发策略-学习如何为支持高用户并发性的应用程序实现事务策略 - 编程入门网
复 清单 1 中的代码,方法是应用 High Concurrency 事务策略的先读取技巧。在 清单 1 所示的代码中,第一个要注意的地方是总共只用了 300 ms 的更新操作(插入和更新)。(此处,我假 定 processTrade() 方法调用的其他方法不执行更新操作。基本技巧是在事务作用域之外执行读取操作和 非更新处理,并且仅将更新封装在事务内部。清单 2 中的代码演示了减小事务作用域并仍然维持原子性 的必要性:
清单 2. 使用 High Concurrency 策略(先读取技巧) public void processTrade(TradeData trade) throws Exception { UserTransaction txn = null; try { //first validate the trade TraderData trader = service.getTrader(trade.getTraderID()); validateTraderEntitlements(trade, trader); verifyTraderLimits(trade, trader); performPreTradeCompliance(trade, trader); //now adjust the account AcctData acct = service.getAcct(trade.getAcctId()); verifyFundsAvailability(acct, trade); adjustBalance(acct, trade); performPostTradeCompliance(trade, trader); //start the transaction and perform the updates txn = (UserTransaction)ctx.lookup("UserTransaction"); txn.begin(); service.insertTrade(trade); service.updateAcct(trade); txn.commit(); } catch (Exception up) { if (txn != null) { try { txn.rollback(); } catch (Exception t) { throw up; } } throw up; } } 事务策略: 高并发策略-学习如何为支持高用户并发性的应用程序实现事务策略(5)时间:2011-10-21 IBM Mark Richards注意,我将 insertTrade() 和 updateAcct() 方法移动到了 processTrade() 方法的末尾,并将它们 封装在了一个编程事务中。通过这种方法,所有读取操作和相应的处理将在事务的上下文之外执行,因此 不会在事务持续时间内在数据库中保持锁。在新代码中,事务持续时间只有 300 ms,这显著低于 清单 1 中的 6100 ms。再次,其目标是减少在数据库中花费的时间,从而减少数据库的总体并发性,以及应用程 序处理较大并发用户负载的能力。通过使用 清单 2 中的代码将数据库占用时间减少至 300 ms,从理论 上说,吞吐量将实现 20 倍的提升。 如表 2 所示,在事务作用域中执行的代码至减少至 300 ms: 表 2. API 层方法探查 — 修改后的事务作用域
虽然这从数据库并发性的角度来说是一种显著的改善,但先读取技巧带来了一个风险:由于为更新指 定的对象上没有任何锁,因此任何人都可以在此 LUW 过程中更新这些未锁定的实体。因此,您必须确保 被插入或更新的对象一般情况下不会由多个用户同时更新。在之前的交易场景中,我做了一个安全的假设 ,即只有一个交易者会在特定的时间操作特定的交易和帐户。但是,并非始终都是这种情况,并且可能会 出现失效数据异常。 另外需要注意:在使用 Enterprise JavaBeans (EJB) 3.0 时,您必须通知容器您计划使用编程事务 管理。为此,您可以使用 @TransactionManagement(TransactionManagementType. |
||||||
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |