Seata能控制的事务隔离级别能到哪一级别?

发布于 2022-01-07 08:40:30 字数 824 浏览 885 评论 3

在两个由Seata控制的全局事务中,Seata可以通过锁机制来解决两个全局事务的事务隔离。

但假设有如下情景:

服务1和服务2连接到事务协调器,组成分布式服务,服务3不参与分布式事务。服务2和服务3都连接到同一个数据库。

以跨行转账的场景为例:

1. 服务1与服务2构成跨行转账的业务场景,服务3为ATM。按照Seata的AT模式控制分布式事务,当服务1发起跨行转账的动作时,服务1从数据库中扣减金额,并完成一阶段事务提交和undo_log的写入。

2. 服务2收到服务1发送的远程请求,并向数据库写入增加金额的动作和undo_log并提交本地分支事务,但分支事务提交完毕后,通知事务协调器时由于网络出现波动,没有及时通知成功。

3. 在网络波动的这期间,ATM服务(另一个jvm进程)发起一个取款动作,此时数据库中金额被扣减,取款成功,事务提交。

4. 网络恢复,事务协调器收到分支事务提交成功的消息,继续通知服务1进行后续业务逻辑,恰好服务1中出现了业务错误,抛出异常,全局事务需要回滚。服务1的本地事务可以正常回滚,但服务2的分支事务在回滚时,由于Seata的回滚规则中发现undo_log中前后两个余额值均与当前余额不同,会认为出现错误,抛出异常。

从ATM服务的角度来讲,ATM在他的本地事务中读到了跨行转账的全局事务中未真正提交的数据,应该判定为出现脏读。Seata是否有方案解决该问题(多进程之间的事务)?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

梦中楼上月下 2022-01-07 18:02:00

现阶段还不能跨语言

裸钻 2022-01-07 15:00:15

关注一波

梦里兽 2022-01-07 13:27:46

我来回答一下这个问题,这个问题和网络抖动恢复之类都没有关系。这个问题是服务3没有纳入到全局事务中,如果服务3纳入到全局事务中有全局锁的判断这时发生不了ATM服务的取款动作。这里等于ATM服务的数据直接走到了数据库没有经过seata中间件。存在于seata之外的数据修改seata无法进行控制,对于这种数据校验失败的回滚也不能进行覆盖性的回滚,这个决策只能交给用户。所以对于seata AT模式的一个原则是数据修改的入口都要交给seata事务控制。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文