分布式事务
分布式事务是指涉及多个独立组件或服务的事务操作,这些组件可以分布在不同的节点或系统中,并通过网络进行通信。分布式事务需要确保事务的原子性、一致性、隔离性和持久性(ACID特性),同时要解决跨节点或系统的数据一致性和并发控制等问题。
以下是分布式事务的一些关键概念和特点:
原子性(Atomicity):事务的操作要么全部成功提交,要么全部失败回滚,保证事务的原子性,不会出现部分操作成功的情况。
一致性(Consistency):要保证事务执行前后系统数据的一致性,即事务操作前后系统应处于一个合法的状态。
隔离性(Isolation):不同事务之间相互隔离,避免干扰和交叉影响,要求事务操作互相独立。
持久性(Durability):事务一旦提交,其结果应该持久保存在系统中,即使系统发生故障也能够恢复。
分布式事务协议:常见的分布式事务协议包括两阶段提交(Two-Phase Commit, 2PC)、三阶段提交(Three-Phase Commit, 3PC)、Paxos协议、Raft协议等,用于协调不同节点上的事务操作并保证一致性。
并发控制:分布式事务需要考虑并发操作时可能出现的数据竞争和冲突问题,通常采用锁机制、多版本并发控制(MVCC)等技术来确保数据的一致性和正确性。
可扩展性:分布式事务需要具备水平扩展的能力,能够处理大规模数据和高并发请求,同时保持事务的性能和稳定性。
分布式事务在现代分布式系统中广泛应用,例如分布式数据库、分布式消息队列、微服务架构等场景都需要支持分布式事务来保证数据一致性和系统可靠性。然而,分布式事务也面临着性能开销高、复杂度高、死锁风险等挑战,因此需要根据具体业务需求和系统特点来选择合适的分布式事务实现方式。
分布式事务与普通事务的区别
并发事务会导致数据脏读、不可重复读、幻读、更新丢失,MySQL数据库引擎InnoDB的事务隔离级别分别解决脏读、不可重复读。可重复读隔离级别下,并发问题需要靠开发者显式或隐式使用锁来自行解决。
另外,InnoDB引擎通过MVCC,解决脏读、不可重复读,通过MVCC + Next-Key Lock(临键锁)来解决幻读,实现了事务的隔离级别Repeatable Read(可重复读)。
RR防止幻读的讨论:
https://github.com/Yhzhtk/note/issues/42
结论:Innodb 的 RR 隔离界别对范围会加上 GAP,理论上不会存在幻读,但是是否有例外,还需要进一步求证。
普通事务:单数据库中执行,具有ACID的特性,要么成功要么回滚,保证数据的一致性
分布式事务:涉及多个数据库或系统之间的事务操作,在分布式环境下,涉及多个节点和资源,保持事务一致性变得更加复杂。需要确保所有参与者都满足ACID特性。由于还涉及网络通信与协调,可能会对性能产生一定的影响。
分布式事务优缺点
优点
1.高可用
分布式事务可以提供更高的可用性,因为它们可以在多个节点上执行操作。如果一个节点发生故障,其他节点仍然可以继续处理事务。
2.扩展性
分布式事务可以轻松地扩展到处理更大的工作负载。通过将事务分布到多个节点上,可以提高系统的处理能力。
3容错性
由于分布式事务可以在多个节点上执行,即使一个节点发生故障,事务仍然可以继续进行。这提高了系统的容错性和可靠性。
4.灵活性
分布式事务可以根据需要进行配置和部署。可以根据系统的需求选择适当的分布式事务模型,以满足不同的业务需求。
缺点
1.复杂性
分布式事务的设计和实现比较复杂。需要考虑到网络延迟、节点故障、数据一致性等因素,这增加了系统的复杂性。
2.性能开销
由于分布式事务需要在多个节点之间进行通信和协调,这会引入一定的性能开销。网络延迟和数据同步等因素可能会导致事务的执行时间增加。
3.一致性问题
在分布式系统中,由于网络延迟和节点故障等原因,可能会导致数据的不一致性。分布式事务需要解决这些一致性问题,以确保数据的正确性。
4.难以调试
由于分布式事务涉及多个节点和多个操作,当事务出现问题时,调试和排查错误可能会变得更加困难。
需要考虑:
数据一致性
跨多个节点:设计跨越多个网络结点或远程服务的数据操作
两阶段提交:一种协调机制,用于管理跨多个节点的操作,比如2PC,第一阶段,各个参与节点预提交更改,第二阶段,所有结点都成功,事务才会被全局提交,如果有一个失败,整体回滚。
分区容错性:分布式环境中可能遇到分区,导致部分节点不可用。可考虑设计成最终一致性模型。
性能开销:额外的协调和通信,会有向更高的延迟和更低的并发性能。