所以,我有一个设计问题:我有几个正在运行的进程正在更新我的数据库。举个例子,假设一个银行系统,我正在记录从一个账户到另一个账户的转账。在这种情况下,我必须从源帐户中减去转帐金额,并将相同金额作为单笔交易存入目标帐户。
我想绝对确定没有条件会导致我的事务被破坏,所以我最初考虑在执行计算并提交更改时对源帐户和目标帐户进行悲观锁定。从我在网上看到的有关JPA的内容来看,似乎不容易支持悲观锁定(至少不是直接支持)。
任何人都可以告诉我其他方法可以确保我的交易在多个流程中的完整性吗?
非常感谢任何帮助/指示。
...谢谢
- 史蒂夫
答案 0 :(得分:2)
在使用分离持久性(例如JPA)的系统中锁定的首选方法是使用乐观锁定,因为它倾向于减少数据库级别的争用量,允许在发生写入时继续读取。启用乐观锁定的方法是将@Version注释添加到类中的特定版本字段。
@Entity
public class Account {
@Id
private long id;
@Version
private long version;
@Basic
private BigDecimal balance;
}
然后JPA实现将为您管理您的对象版本。建议您将此字段保密,不要为其指定getter或setter,因为您希望JPA实现单独负责此字段。然后,您的主要考虑因素是抛出OptimisticLockException时要采取的操作(如果其他人在您设法保存更改之前更新了其中一个帐户,则会发生这种情况。
不幸的是,没有一个解决方案可以解决这个问题,最简单的方法是重新加载这两个帐户并重试事务,如果没有太多的事务同时访问同一个帐户,这将正常工作。在这种情况下,您可能遇到一些问题,其中一些请求花费大部分时间重试事务,但最好从简单的解决方案开始,然后根据应用程序的需要更改实现。