【发布时间】:2012-01-03 22:42:08
【问题描述】:
我想用下面的例子来描述这个问题:
假设我们正在开发应用程序(基于 Hibernate JPA 和 Spring),该应用程序允许其用户执行两种必须以可序列化模式为每个用户执行的事务操作。只要应用程序必须同时健壮且性能良好,我们可以使用 ReentrantLock 周围的某种包装器进行同步:
void operation1(user) {
userLockWrapper.lock(user.id); //gets ReentrantLock for specified id from internal map and locks it
try {
//start transaction
//perform operation
//commit transaction
} finally {
userLockWrapper.unlock(user.id).
}
}
void operation2(user) {
userLockWrapper.lock(user.id); //same wrapper instance as in operation1
//same logic as in operation1
}
现在假设为了提高可扩展性,我们将系统划分为两个独立模块,这些模块在不同的虚拟机中运行并使用相同的数据库,其中第一个模块负责操作 1,第二个模块负责操作 2。想到的第一个决定是使用悲观锁,例如:
@Transactional
void operation1(user) { //same goes for operation2
//firing extra select for update sql statement here
entityManager.find(User.class, user.id, LockModeType.PESSIMISTIC_WRITE)
//performing operation
}
我想知道是否有更好的解决方案。希望得到社区的一些建议。
【问题讨论】:
标签: java hibernate spring jpa transactions