我有一个具有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
问题内容: 我叫两种方法,第一种方法更新一个表,第二种方法在另一个表中插入一条记录。当第二笔交易失败时,它不会回退第一笔交易。 这是我的支持豆: EJB接口: EJB类: 我的自定义例外: 编辑: 添加了DAO类: 和DAO接口: 问题答案: 在这种情况下,关键问题是某些JBoss版本中数据源中的默认错误。原始代码很好,并且可以在其他应用程序服务器(WebSphere App Server和轻量级
我正在学习使用JPA。我有点困惑。 根据JPA,EntityManager管理事务。但是一种设计模式是将EntityManager注入DAO中。那么不同的实体管理器怎么可能是同一个事务呢? 这是我要解决的案子 我定义了 DAO . 我有一个服务。 然后从@Controller,我将调用main Method()。在同一个服务中并使用同一个存储库中,对transactionalMED1、transa
我想在事务中使用SpringKafka,但我真的不明白应该如何配置它以及它是如何工作的。 这是我的配置 此配置用于事务id前缀为的DefaultKafkaProducerFactory: 问题一: 我应该如何选择这个交易ID前缀?如果我理解正确,这个前缀被Spring用来为创建的每个生产者生成一个事务性id。 为什么我们不能只使用"UUID。随机UUID()? 问题二: 如果生产者被销毁,它将生成
问题内容: 在一个岛中,我有2个@Transactional方法。 如果我不提供任何明确的属性, 那会发生什么,如果 我在另一种体内运行一种方法? 两种方法都可以在同一交易中运行吗? 问题答案: 春季AOP中的代理 使用事务性时,您要处理类的代理,因此在这种情况下: 您从外部调用代理,但是第二个方法调用是从代理对象内部进行的,因此没有事务支持。所以自然地,它们运行在同一事务中,无论第二种方法中@T