什么时候使用全局事务或者使用spring aop进行事务
题
Q1.我确实明白当我们需要处理多个数据库时,我们需要使用全局事务。但从这篇文章 http://fogbugz.atomikos.com/default.asp 。有人建议只使用 spring aop 来建议不同的事务管理器(更多>数据源/会话工厂)。谁能解释一下在什么样的情况下我们可以使用这种方法以及在什么样的情况下我们需要带有atomikos或jotm或ejb..等的XA(全局事务)
解决方案
如果你指的是该消息 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 0.4。对于不同的豆配置不同的事务语义了解细节。
但如果你需要多个事务性的资源(典型例子是关系数据库和消息队列),那么你需要的全球的事务的支持,这意味着一个J2EE事务管理器(由J2EE应用程序服务器或单机提供像Atomikos公司,的JBossTS,JOTM等)。
其他提示
我认为帕斯卡已经彻底回答了你的问题,但我想尝试简化/总结它。
如果您需要在没有事务范围要求的情况下对数据源执行并行、独立的任务(例如如果当一个事务在一个数据源中失败时,它不必在其他数据源中回滚),请使用 Pascal 的建议或中的方法 http://fogbugz.atomikos.com/default.asp?community.6.596.2 (例如。非 JTA / 非 XA / 非分布式)
如果您需要跨不同数据源的事务范围,例如如果一个数据源中的回滚应该回滚同一逻辑事务范围下另一个数据源中的更改(例如银行数据库和信用卡数据库进行资金转移,如果一个数据库没有相应的增加/减少,则另一个数据库无法获得减少/增加),您需要一个 JTA 事务管理器(XA/分布式)
希望这能让图片更清晰(如果我过度简化或完全错误,我愿意接受评论)