Tha*_*hla 5 java spring hibernate
我发现了很多关于这个主题的帖子,但所有答案都只是没有示例代码的文档链接,即如何在实践中使用并发.
我的情况:我有一个实体House(用于简化)两个属性,number(id)和owner.该数据库被初始化为10 Houses以number1-10和owner永远null.
我想给房子分配一个新的所有者,目前没有所有者,而且是最小的number.我的代码看起来像这样:
@Transactional
void assignNewOwner(String newOwner) {
//this is flagged as @Transactional too
House tmp = houseDao.getHouseWithoutOwnerAndSmallestNumber();
tmp.setOwner(newOwner);
//this is flagged as @Transactional too
houseDao.update(tmp);
}
Run Code Online (Sandbox Code Playgroud)
对于我的理解,虽然@Transactional被使用,同样House可以被两次分配给不同的业主,如果两个请求获取空一样House的tmp.我如何确保不会发生这种情况?
我知道,包括选择空的更新House会解决问题,但在不久的将来,我想更多地修改/使用tmp对象.
乐观的
如果您向实体/表添加版本列,那么您可以利用称为乐观锁定的机制。这是确保实体状态自我们在事务上下文中获取实体以来未发生更改的最有效方法。
一旦你createQuery使用了,session你就可以打电话setLockMode(LockModeType.OPTIMISTIC);
然后,就在提交事务之前,持久性提供程序将查询该实体的当前版本并检查它是否已被另一个事务增量。如果是这样,您将得到 OptimisticLockException 和事务回滚。
悲观
如果您不对行进行版本控制,那么您将面临悲观锁定,这基本上意味着您在数据库级别上为查询实体物理创建锁,并且其他事务无法读取/更新这些某些行。
您可以通过在对象上设置它来实现这一点Query:
setLockMode(LockModeType.PESSIMISTIC_READ);
或者
setLockMode(LockModeType.PESSIMISTIC_WRITE);
| 归档时间: |
|
| 查看次数: |
121 次 |
| 最近记录: |