何时使用全局事务,或者使用Spring AOP进行事务?

3
Q1. 我理解当我们需要处理多个数据库时,我们需要使用全局事务。但是从这篇文章http://fogbugz.atomikos.com/default.asp中得知,该作者建议只使用Spring AOP来通知不同的事务管理器(更多>数据源/会话工厂)。请问在什么情况下我们可以只使用这种方法?在什么情况下我们需要XA(全局事务)和Atomikos或JOTM或EJB等技术?

1
你确定你发布了正确的链接吗? - Pascal Thivent
2个回答

4
我认为Pascal已经详细回答了你的问题,但我想尝试简化/总结一下。
  • 如果您需要在没有事务范围要求的情况下(例如,当一个数据源中的事务失败时,不必在其他数据源中回滚)对数据源执行并行、独立的任务,请使用Pascal的建议或此处的方法(非JTA /非XA /非分布式)

  • 如果您需要跨不同的数据源具有事务范围,例如,如果一个数据源中的回滚应该回滚在同一逻辑事务范围内的另一个数据源中的更改(例如,银行数据库和信用卡数据库进行资金转移,您不能在其中一个数据库中获得减少/增加而在另一个数据库中没有相应的增加/减少),则需要使用JTA事务管理器(XA /分布式)

希望这能让问题更加清晰(如果我过于简化或者错了,欢迎指正)。

@ehrann,你很有帮助。 - cometta

3
如果您在提到这条消息http://fogbugz.atomikos.com/default.asp?community.6.596.2,那么来自OP的问题中重要的部分是:
任务可以是针对datasource1 datasource2的一组SQL命令。
换句话说,OP不会注册多个事务资源,他将使用一个或另一个(并明确写道他实际上不需要XA支持)。因此,他实际上不需要全局事务支持,他只能使用本地事务,并且对于他的用例,使用J2EE事务管理器不是必需的
这就是答案所建议的:使用Atomikos不是必要的,可能过度了。
使用两个dataSource、两个txManager、两个txAdvice并定义不同的<aop:advisor/>元素,其具有不同的'pointcut''advice-ref'属性值,可以将完全不同的事务配置应用于不同的服务层对象/方法。
有关详细信息,请参见第9.5.4节“为不同的bean配置不同的事务语义”
但是,如果您需要使用多个事务资源(通常是关系型数据库和消息队列),则需要全局事务支持,这意味着需要J2EE事务管理器(由J2EE应用服务器或类似Atomikos、JBossTS、JOTM等的独立产品提供)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接