【发布时间】:2011-12-10 23:17:10
【问题描述】:
我正在尝试对一行进行选择并更新值。当我这样做时,我需要独占访问该行。换句话说,在我更新行之前,没有其他进程(VM 内部或外部)应该能够读取该行。当前值不应该是“可选择的”。我尝试了以下事务注释。
@Transactional(isolation = Isolation.SERIALIZABLE, readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Exception.class, timeout=960)
这在 Spring 上下文中绝对有效,但是在事务中间放置一个 sleep 语句时,我仍然能够使用数据库工具选择当前行值。
有没有办法使用 Spring/Hibernate 获得 XLOCK/ROWLOCK(以适当者为准)?
版本:
- 春季:3.0.5.RELEASE
- 休眠:3.6.3.Final
- JTDS:1.2.4
如果我不能使用 Spring/Hibernate,将非常感谢提供 JTDS 示例的链接。
谢谢。
【问题讨论】:
-
您是否尝试过在数据库工具上发出带有“for update”后缀的选择,然后尝试从应用程序运行程序?在运行上述查询之前,您可能还需要检查工具中的隔离级别。
-
我会试试的。可能我已经获得了我需要的那种锁,而没有做任何改变。
-
我认为这应该明确告诉您发生了什么,请更新您是否看到它没有锁定。
-
我不能执行“FOR UPDATE”,但是当我使用“with (paglock,XLOCK)”时,我似乎得到了我想要的锁定。如果你发布你的答案,我会给你赏金。
标签: java sql-server hibernate spring transactions