Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Oracle Toplink:自动递增/递减金额_Java_Database_Persistence_Toplink - Fatal编程技术网

Java Oracle Toplink:自动递增/递减金额

Java Oracle Toplink:自动递增/递减金额,java,database,persistence,toplink,Java,Database,Persistence,Toplink,我有一个并发应用程序,需要将递增/递减(余额变化)更新到account表中的余额列 我正在使用Oracle Toplink。 执行并发更新的一种方法是通过使用version列使用乐观锁定 1) 乐观锁 更新帐户集余额=?,版本=?其中id=?和版本= 2) 原子更新 更新账户集余额=余额+?其中id= 我想使用2)选项,因为它更简单,并且不需要我在更新之前先读取值(如1所示) 我在执行更新查询时遇到问题。问题在于,它没有反映最终的金额 2)选项是否真的以原子方式更新 我是否遵循了正确的编码方法。

我有一个并发应用程序,需要将递增/递减(余额变化)更新到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);