程序猿基础知识的学习、理解、整理——事务(方方土)
- 什么是XA事务?在什么场景下会出现XA事务?
@TransactionAttribute(TransactionAttributType.REQUIRED)
public void placeFixedIncomeTrade(TradeData trade)
throws Exception{
try{
Placement placement = placementService.placeTrade(trade);
//将placemenet发送到jms消息队列中
placementService.sendPlacementMessage(placement);
//将placement写到数据库中
excutionService.executeTrade(placement);
}
catch(TradeExecutionExcepiton e){
log.fatal(e);
sessionCtx.setRollbackOnly();
throw e
}
}
上面的函数,如果要求这个函数中的操作是在同一个事务中,那么它就是一个XA事务,因为它在一个事务内部涉及了两种资源,jdbc资源和jms资源;当然并非所有XA事务都是涉及两种不同的资源,如果在同一个事务内涉及两个不同的数据库的操作,也是XA事务
- 那么对于XA的事务,该怎么处理呢?
对于XA的接口描述中,有两个概念,事务管理器概念和资源管理器的概念,工作机制参加下图:
对于XA的事务,正常的提交流程如下图:
- 那么对于XA事务,最佳实践是什么呢?
对于XA事务,我的观点是能免则免。
为什么?
1、很多开发人员对于事务的概念不一定搞的非常清楚,更加不用说是XA事务了
2、目前很多XA的驱动程序对于XA的支持不是很好,比如weblogic自带的XA驱动还存在问题
3、如果使用XA事务,那么对于事务提交的性能是由一定影响的
怎么样?
1、在设计上要避免同一个事务跨库或者跨资源,这个很重要,很多XA事务其实是可以在设计阶段进行避免的;
2、要识别一下存在跨库或者跨资源的操作是否就必须在一个事务中个,比如,如果对于一个库是查询操作,对于另外一个库是插入操作,那么就没必要用XA事务;