繁体   English   中英

Oracle Toplink:以原子方式递增/递减的量

[英]Oracle Toplink: Atomically incrementing/decrementing amount

我有并发应用程序,需要将增加/减少(余额的变化)更新到帐户表中的余额列。

我正在使用Oracle Toplink。 进行并发更新的一种方法是通过使用版本列来使用乐观锁定。

1)乐观锁

更新帐户集余额= ?,版本=? id =? 和版本=?

2)原子更新

更新帐户集余额=余额+? id =?

我想使用2)选项,因为它更容易使用,并且不需要我在更新之前先读取值(如1))。

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);

我在执行更新查询时遇到问题。 问题在于它没有反映出最后的金额。

是2)选项实际上是原子更新的吗?

我是否遵循正确的编码方法。 这个例子有什么问题吗?

请指导

您的原子更新不是原子更新。

如果有多个交易同时进行,则两个交易都会增加自己对当前余额的看法,最后一个会获胜。 实际上,事务是相互隔离的(即ACID中I ),并且看不到其他事务所做的更改。

您仍然需要锁定(乐观或悲观)才能正确执行此操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM