何时使用全局事务或使用spring aop进行事务处理

时间:2010-01-07 03:03:21

标签: java hibernate jta jotm atomikos

Q1。我知道当我们需要处理多个数据库时,我们需要使用全局事务。但是从这篇文章http://fogbugz.atomikos.com/default.asp开始。建议的人只需使用spring aop就不同的transactionmanager建议(更多> datasource / sessionfactory)。任何人都可以解释在什么样的情况下我们可以使用这种方法在什么样的情况下我们需要XA(全局事务)与atomikos或jotm或ejb..etc

2 个答案:

答案 0 :(得分:4)

我认为Pascal已经彻底回答了您的问题,但我想尝试简化/总结它。

  • 如果您需要在没有事务范围要求的情况下对数据源执行并行任务(例如,如果事务在一个数据源中失败,则不必在其他数据源中回滚),请使用Pascal的建议或方法在http://fogbugz.atomikos.com/default.asp?community.6.596.2中(例如非JTA /非XA /非分布式)

  • 如果您需要跨不同数据源的事务范围,例如如果一个数据源中的回滚应该回滚同一逻辑事务范围内的另一个数据源中的更改(例如,银行数据库和信用卡数据库进行资金转移,则无法在没有相应的行政/法令的情况下获得一个法令/法案在另一个)你需要一个JTA事务管理器(XA /分布式)

希望这能使画面更加清晰(如果我过度简化它或者只是错误的话,我会公开评论)

答案 1 :(得分: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. Configuring different transactional semantics for different beans部分。

但是如果您需要使用多个事务资源(通常是关系数据库和消息队列),那么您需要全局事务支持,这意味着J2EE事务管理器(由J2EE应用程序服务器提供或独立提供)像Atomikos,JBossTS,JOTM等)。