分布式事务的实现原理详解
事务管理器协调整个分布式事务的各个部分,它与多个资源管理器通信,分别处理他们管理的事务,这些事务都是整体事务的一个分支。 ![]() distributed-transaction-and-transactions 正如两阶段提交协议中定义的,MySQL 提供的 XA 接口可以非常方便地实现协议中的投票和提交阶段,我们可以通过一下的流程图简单理解一下 MySQL XA 的接口是如何使用的: ![]() mysql-xa-transaction-states XA 确实能够保证较强的一致性,但是在 MySQL XA 的执行过程中会对相应的资源加锁,阻塞其他事务对该资源的访问,如果事务长时间没有 COMMIT 或者 ROLLBACK,其实会对数据库造成比较严重的影响。 Saga 两阶段提交其实可以保证事务的强一致性,但是在很多业务场景下,我们其实只需要保证业务的最终一致性,在一定的时间窗口内,多个系统中的数据不一致是可以接受的,在过了时间窗口之后,所有系统都会返回一致的结果。 Saga 其实就一种简化的分布式事务解决方案,它将一系列的分布式操作转化成了一系列的本地事务,在每一个本地事务中我们都会更新数据库并且向集群中的其他服务发送一条的新的消息来触发下一个本地的事务;一旦本地的事务因为违反了业务逻辑而失败,那么就会立刻触发一系列的回滚操作来撤回之前本地事务造成的副作用。 LLT 相比于本地的数据库事务来说,长事务(Long Lived Transaction)会对一些数据库资源持有相对较长的一段时间,这会严重地影响其他正常数据库事务的执行,为了解决这一问题,Hector Garcia-Molina 和 Kenneth Salem 在 1987 发布了论文 Sagas 用于解决这一问题。 如果一个 LLT 能够被改写成一系列的相互交错重叠的多个数据库事务,那么这个 LLT 就是一个 Saga;数据库系统能够保证 Saga 中一系列的事务要么全部成功执行、要么它们的补偿事务能够回滚全部的副作用,保证整个分布式事务的最终一致性。Saga 的概念和它的实现都是非常简单的,但是它却能够有很大的潜力增加整个系统的处理能力。 ![]() long-lived-transaction-and-transactions 事务越长并且越复杂,那么这个事务由于异常而被回滚以及死锁的可能性就会逐渐增加,Saga 会将一个 LLT 分解成多个短事务,能够非常明显地降低事务被回滚的风险。 协同与编排 (编辑:西安站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |