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