使用Hibernate使用Spring Transactions的SQL Server独占行锁(XLOCK ROWLOCK)

时间:2011-10-19 13:59:27

标签: java sql-server hibernate spring transactions

我正在尝试对行进行选择并更新值。当我这样做时,我需要独占访问该行。换句话说,在更新行之前,没有其他进程(VM内部或外部)应该能够读取行。当前值不应“可选”。我已经尝试了以下事务注释。

@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.Final
  • JTDS:1.2.4

如果我不能使用Spring / Hibernate,那么非常感谢JTDS示例的链接。

谢谢。

2 个答案:

答案 0 :(得分:4)

SERIALIZABLE隔离级别允许其他事务读取数据,但不允许修改。所以你需要明确地SELECT ... FOR UPDATE(在Hibernate中:Query#setLockMode(LockMode.UPGRADE))。

答案 1 :(得分:2)

对Hibernate使用显式锁定。有更多信息here

然而,我认为你必须再考虑一次 - 你真的需要悲观的锁吗?在大多数情况下,乐观锁效果更好,而hibernate非常支持版本控制。