Java Oracle Toplink:自动递增/递减金额
我有一个并发应用程序,需要将递增/递减(余额变化)更新到account表中的余额列 我正在使用Oracle Toplink。 执行并发更新的一种方法是通过使用version列使用乐观锁定 1) 乐观锁 更新帐户集余额=?,版本=?其中id=?和版本= 2) 原子更新 更新账户集余额=余额+?其中id= 我想使用2)选项,因为它更简单,并且不需要我在更新之前先读取值(如1所示) 我在执行更新查询时遇到问题。问题在于,它没有反映最终的金额 2)选项是否真的以原子方式更新 我是否遵循了正确的编码方法。这个例子有什么问题吗Java Oracle Toplink:自动递增/递减金额,java,database,persistence,toplink,Java,Database,Persistence,Toplink,我有一个并发应用程序,需要将递增/递减(余额变化)更新到account表中的余额列 我正在使用Oracle Toplink。 执行并发更新的一种方法是通过使用version列使用乐观锁定 1) 乐观锁 更新帐户集余额=?,版本=?其中id=?和版本= 2) 原子更新 更新账户集余额=余额+?其中id= 我想使用2)选项,因为它更简单,并且不需要我在更新之前先读取值(如1所示) 我在执行更新查询时遇到问题。问题在于,它没有反映最终的金额 2)选项是否真的以原子方式更新 我是否遵循了正确的编码方法。
请指导您的原子更新不是原子更新 如果多个交易同时进行,双方都将增加自己对当前余额的看法,最后一个交易将获胜。事实上,事务是相互隔离的(这是ACID中的I),看不到其他事务所做的更改
您仍然需要锁定(乐观或悲观)才能正确执行此操作。感谢您的快速响应。在查询周围添加“开始”和“结束”如何?它会锁定行吗?Oracle不会自己处理吗?我的意思是为什么应用程序需要保持当前余额的视图。下面的查询表示“只需将增量添加到现有值”,应用程序不关心不同线程添加增量值的顺序。>更新账户集余额=余额+?其中id=?我曾使用jdbc尝试过这种方法,它很有效。在这种情况下,使用jdbc和toplink有什么区别吗?将executeQuery()更改为ExecutenSelectingCall()会有区别吗?
SQLCall sc = new SQLCall("update account set balance=balance + #delta where id=#id");
DataModifyQuery data = new DataModifyQuery(sc);
data.addArgument("delta", BigDecimal.class);
data.addArgument("id", Long.class);
Vector param = new Vector(2);
param.add(new BigDecimal(.01));
param.add(new Long(12345));
getSession().executeQuery(data, param);