sharding事务。
我们这么操作:
本地事务,但是会发现如果有异常两边都回滚了。看代码如下:
rollback看一看:
cachedConnections中缓存了2个connection。
对于每个connection调用rollbak。
对于commit也是这种轮询链接然后提交。这种方式给人一种分布式一致的感觉,其实不然,如果多个connection依次commit,若后面的commit失败则前面已经commit的connection不会受到影响不是强一致的。并且提交/回滚是Connection粒度的
所以在一个事务中的两个不同的库都实现了回滚,但是不是二阶段提交。我们试着拆开成若干事务
换成XA之后:
炸了,因为:
整上:
然后又炸了:
这个mapper最后会被增强,增强后的类在调试的时候已经拿不到@ShardingTransactionType的类型了。
在用XA的时候commit上打个断点
在调试的时候尝试去删除commit目标表的数据,发现一个sql进去根本出不来,为什么?锁表了,而且是2个库都锁了,在整个xa事务结束前两个库的目标表都是临界资源,这也是xa的弊端之一。
(已验证local的时候一个connection提交之后,对应库的表就解锁了)
看下xa的提交过程:
com.atomikos.icatch.imp.CompositeTransactionImp#commit
com.atomikos.icatch.imp.CoordinatorImp#terminate
com.atomikos.icatch.imp.CoordinatorImp#commit:
com.atomikos.icatch.imp.CoordinatorStateHandler#commitWithAfterCompletionNotification
好吧 有点难读先到这里吧,docommit结束后数据库那边已经提交了。