我正在尝试对行进行选择并更新值。当我这样做时,我需要对该行的独占访问权限。换句话说,在我更新该行之前,任何其他进程(虚拟机内部或外部)都应该能够读取该行。当前值不应该是“可选择的”。我尝试过以下事务注释。
@Transactional(isolation = Isolation.SERIALIZABLE, readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Exception.class, timeout=960)
这在 Spring 上下文中肯定有效,但是当在事务中间放置 sleep 语句时,我仍然可以使用数据库工具选择当前行值。
有没有办法使用 Spring/Hibernate 获取 XLOCK/ROWLOCK(无论哪个合适)?
版本:
- Spring :3.0.5.RELEASE
- hibernate :3.6.3.最终版
- JTDS:1.2.4
如果我无法使用 Spring/Hibernate,非常感谢 JTDS 示例的链接。
谢谢。
最佳答案
SERIALIZABLE
隔离级别允许其他事务读取数据,但不允许修改。因此,您需要显式SELECT ... FOR UPDATE
(在 Hibernate 中:Query#setLockMode(LockMode.UPGRADE)
)。
关于java - SQL Server 独占行锁 (XLOCK ROWLOCK) 使用 Spring Transactions 使用 Hibernate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7822475/