传播。REQUIRES_NEW锁定

时间:2019-01-04 09:51:23

标签: mysql hibernate locking

考虑事务,这需要很长时间。在此期间,我想对TableSmall执行一些小的更新,这些更新应该立即执行,并且回滚主Transaction不应回滚那些小的更新。

我当前的问题是,这些小的更新将锁定TableSmall \,直到交易完成。即使事务仍在运行,我也需要能够继续更新TableSmall。

可以用@Transactional(propagation = Propagation.REQUIRES_NEW)注释这些小更新,以避免锁定这些小更新的行/表吗?

1 个答案:

答案 0 :(得分:0)

摘自文档。

  

创建一个新事务,如果存在则暂停当前事务。类似于具有相同名称的EJB事务属性。

     

注意:实际的事务中止将无法在所有事务管理器中立即使用。这尤其适用于org.springframework.transaction.jta.JtaTransactionManager,它要求使javax.transaction.TransactionManager可用(在标准Java EE中特定于服务器)。

     

PROPAGATION_REQUIRES_NEW范围始终定义其自己的事务同步。现有同步将被暂停并适当恢复。

因此,我认为,如果您仅在一个线程实例中运行这些小的更新,它将按您的期望工作。

对于小任务,也请考虑@Transactional(propagation = NESTED)。这个link也很有趣。

之所以得到锁,是因为在多线程环境中,我们多次调用此方法,结果导致所有事务都被挂起。