我们有一个系统,我们必须在一个实体中使用悲观锁定。我们使用的是休眠,所以我们使用 LockMode.UPGRADE。但是,它不会锁定。
- 这些表是 InnoDB
- 我们已经检查了锁定在数据库中是否正常工作(5.0.32),所以这个错误http://bugs.mysql.com/bug.php?id=18184似乎没有问题。
- 我们已检查数据源是否包含该
autoCommit = false
参数。 - 我们检查了 SQL hibernate(3.2 版)生成的是否包含“FOR UPDATE”。
谢谢,
我们有一个系统,我们必须在一个实体中使用悲观锁定。我们使用的是休眠,所以我们使用 LockMode.UPGRADE。但是,它不会锁定。
autoCommit = false
参数。谢谢,
我遇到了非常相似的事情。我在 Spring 中使用 @Transactional 注释并且我正在发出一个更新选择并且没有获取更新锁(我有其他线程正在发出相同的更新选择并且已经验证它们没有阻塞锁)。当我明确获得 Hibernate 会话并发出 beginTransaction 并围绕代码块提交时,一切正常。
这并没有给我关于 Spring 容器管理事务的温暖和模糊的感觉。
当我遇到类似问题时,那是因为我错误配置了 Spring 托管事务。仔细检查您的 Spring tx 配置。
<tx:annotation-driven transaction-manager="txManager"/>
<bean id="txManager" class="org.springframework.orm.hibernate.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
您需要的事实也autocommit = false
可能表明您没有在事务中操作。当您尝试访问一对多集合时,您是否也会遇到延迟初始化异常?
我发现确定 Spring tx 方面是否实际工作的最直接方法是使用调试器。在发出FOR UPDATE
SQL 的方法中放置一个断点。Upstack 直到你达到你的@Transactional
课程/方法。您应该在调用堆栈中的下一次调用中看到 Spring 方面代理。
最近我遇到了这样的问题。我们与 2 个 tx 管理器一起工作,因为我们有不同的数据库,问题是事务正在使用配置到另一个数据库的 txmanager,因此在与查询数据库的连接上没有被禁用自动提交模式,然后再执行选择更新。使用正确的 txmanager 解决了这个问题。希望它在未来对其他人有所帮助。