我正在尝试对行进行选择并更新值。当我这样做时,我需要独占访问该行。换句话说,在更新行之前,没有其他进程(VM内部或外部)应该能够读取行。当前值不应“可选”。我已经尝试了以下事务注释。
@Transactional(isolation = Isolation.SERIALIZABLE, readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Exception.class, timeout=960)
这绝对适用于Spring上下文,但是当在事务中间放置一个sleep语句时,我仍然可以使用数据库工具选择当前行值。
有没有办法使用Spring / Hibernate获取XLOCK / ROWLOCK(取决于哪个)?
版本:
如果我不能使用Spring / Hibernate,那么非常感谢JTDS示例的链接。
谢谢。
答案 0 :(得分:4)
SERIALIZABLE
隔离级别允许其他事务读取数据,但不允许修改。所以你需要明确地SELECT ... FOR UPDATE
(在Hibernate中:Query#setLockMode(LockMode.UPGRADE)
)。
答案 1 :(得分:2)
对Hibernate使用显式锁定。有更多信息here。
然而,我认为你必须再考虑一次 - 你真的需要悲观的锁吗?在大多数情况下,乐观锁效果更好,而hibernate非常支持版本控制。