小编典典

Spring交易REQUIRED与REQUIRES_NEW:回滚交易

hibernate

我有一个具有propagation = Propagation.REQUIRES_NEW事务性属性的方法:

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void createUser(final UserBean userBean) {
    //Some logic here that requires modification in DB
}

可以同时多次调用此方法,并且对于每个事务,如果发生错误而不是将其回滚(独立于其他事务),则将被多次调用。

问题在于,这可能迫使Spring创建多个事务,即使另一个事务可用,也可能会导致一些性能问题。


Java doc propagation = Propagation.REQUIRED说:Support a current transaction, create a new one if none exists.

这似乎解决了性能问题,不是吗?

回滚问题呢?如果在使用现有事务时新方法调用回滚怎么办?那会不会回滚整个交易,即使以前的呼叫也是如此?

[编辑] 我想我的问题还不够清楚:

我们有数百个客户端连接到我们的服务器。

对于每个客户,我们自然需要发送有关事务的反馈(确定或例外->回滚)。

我的问题是:如果使用REQUIRED,是否表示仅使用一个事务,并且如果第100个客户端遇到问题,则第一个客户端的事务也会回滚?


阅读 522

收藏
2020-06-20

共1个答案

小编典典

REQUIRES_NEW仅当从事务上下文中调用该方法时,使用才有意义。从非事务上下文调用该方法时,其行为将完全相同REQUIRED-将创建一个新事务。

这并不意味着所有客户都只有一个事务-每个客户都将从非事务上下文开始,并且一旦请求处理达到@Transactional,它将创建一个新事务。

因此,考虑到这一点,如果使用REQUIRES_NEW该操作的语义是有意义的-比我不担心性能-这将教科书过早优化-
我宁愿强调正确性和数据完整性,并在性能指标确定后再担心性能收集,而不是之前。

回滚时-使用REQUIRES_NEW将强制新事务的开始,因此异常将回滚该事务。如果还有另一个正在执行的事务-根据异常的发生还是被捕获,是否会回滚-
根据操作的具体情况进行选择。另外,对于交易策略和回滚的更深入讨论,我建议:马克·理查兹(Mark
Richards),《交易策略:了解交易陷阱》

2020-06-20