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

posted @ 2020-10-01 01:02  l2c  阅读(588)  评论(0)    收藏  举报