1、吴小彬 提问
请教下,如果分支事务中使用了分库分表中间件(shardingsphere-proxy、mycat 等),Seata-AT 模式是不是不能用的?是只可以用 TCC 模式吗?现在的 shardingsphereProxy 中间件(不是 shardingsphereJdbc )用 AT 模式,它对微服务来说就是一个 MySQL 连接,它是怎么知道微服务调用链中的 xid 的?
A:可以用,shardingsphere 4.1 支持 Seata AT, proxy 我估摸着有点悬,因为他属于一个代理层。Jdbc 是直接在应用的 Jdbc 层提供服务的,所以 AT 可以很好的支持。
2、谭玖朋 提问:
在关于 AT 模式,第一阶段执行完后生成行锁然后注册分支事务,其中的行锁具体是指什么锁呢?因为发现第一阶段执行完后,其实再查数据的话是已经改变了。所以关于这个行锁这么解释?
A:Select for update 的时候,首先 Seata 会代理这个语句,去查询 TC 这个行有没有锁住,如果没锁住,客户端业务用了 for update 那么就拿到了本地锁,此时因为本地锁排他,这个时候没有全局锁的 for update 就是分布式下的读已提交。
不是允许脏读,是读已提交。读未提交是默认的,所以只有在你 update 的时候(update 是当前读),但是如果你的 update 是基于快照度的 select 结果,可能会出现事与愿违的结果,如果你要基于某个数据来 update,要么 for update 来读分布式下的已提交,要么就用 update x=x-1 之类的写法,因为提交时会抢占全局锁,没抢到会 rollback,释放当前锁进行重试,这样就能保证抢到锁的时候,update 的数据当前读是分布式下的读已提交并修改。
目前好像没人写关于 AT 行锁及全局锁部分源码有分析讲解的资料,如果感兴趣可以去阅读一下,写出来投稿给我们。
本周发布详情如下:
同时兼容 Glibc 和 musl libc的应用
支持基于 DCAP (Intel SGX Data Center Attestation Primitives) 的远程验证
修复了内存泄漏问题
本文分享自微信公众号 - 金融级分布式架构(Antfin_SOFA)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
来源:oschina
链接:https://my.oschina.net/sofastack/blog/4911950