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结束后数据库那边已经提交了。

浙公网安备 33010602011771号