当前位置: 首页 > 面试题库 >

春季交易REQUIRED与REQUIRES_NEW:回滚交易

弘承运
2023-03-14
问题内容

我有一个具有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个客户遇到问题,第一个客户的事务也将回滚?


问题答案:

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

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

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

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



 类似资料:
  • 问题内容: 我有一个具有事务性属性的方法: 可以同时多次调用此方法,并且对于每个事务,如果发生错误而不是将其回滚(独立于其他事务),则将被多次调用。 问题在于,这可能迫使Spring创建多个事务,即使另一个事务可用,也可能会导致一些性能问题。 Java doc 说: 这似乎解决了性能问题,不是吗? 回滚问题呢?如果在使用现有事务时新方法调用回滚怎么办?那会不会回滚整个交易,即使以前的呼叫也是如此?

  • 问题内容: 在下面的代码方法doService1()更新正确的SQL,但doService2()SQL有一些问题,但是当我打电话doService()它必须提交doService1()更新到数据库,即使doService2()有sql exception,因为doService2() 有一个REQUIRES_NEW Propagation类型,但是当我尼姑此doService1()更新不承诺DB

  • 问题内容: 我想使用SpringContextTests测试我的Dao类。 在我的方法类中,我扩展了,以便我的测试类与JUnit4集成。我还设置了配置,并在和的DownDown中进行了初始化和数据库清理。我的测试课效果很好。 我的问题是,当我运行测试类并且数据库中充满了数据时,原始数据没有回滚并且数据库被清除了。在该方法中,我清除数据库并填充数据,以为我可以回滚数据库,但不能回滚。 任何人都可以找

  • 问题内容: 您能否解释以下两种类型的交易之间的区别: 休眠交易 春季交易 我也想知道有关注释的信息。 问题答案: 对于初学者来说,它们都是事务,但是它们包含不同的概念和组件。 TL; DR Hibernate处理数据库特定的事务,而spring提供常规的事务管理服务。是配置事务管理行为的好方法。 长话说: 交易次数 事务基本上是工作的单元(即,对某项的更改),可以作为可提交或回滚的单个操作进行管理

  • 问题内容: 我叫两种方法,第一种方法更新一个表,第二种方法在另一个表中插入一条记录。当第二笔交易失败时,它不会回退第一笔交易。 这是我的支持豆: EJB接口: EJB类: 我的自定义例外: 编辑: 添加了DAO类: 和DAO接口: 问题答案: 在这种情况下,关键问题是某些JBoss版本中数据源中的默认错误。原始代码很好,并且可以在其他应用程序服务器(WebSphere App Server和轻量级

  • 问题内容: 我正在开发基于JPA +Hibernate,Spring和Wicket的Web应用程序。我想知道在我的代码中实现事务的最佳方法是什么?我应该使用什么交易经理?应该是,还是其他?我想用Spring来管理我的交易。 问题答案: 南大是正确的,你 可以 只使用JpaTransactionManager接口。我们在这里谈论的事务管理器抽象是Spring的PlatformTransactionM