mysql隔离级别? 分别解决了什么问题?
MySQL支持四种事务隔离级别,分别为:
读未提交(Read Uncommitted):
- 在这种隔离级别下,事务可以读取到其他事务尚未提交的数据变更,也就是脏读(Dirty Read)可能发生。
- 解决的问题较少,牺牲了一致性,带来了更高的并发性能。
读已提交(Read Committed):
- 在这个级别下,一个事务只能看到已经提交的数据,同一事务内前后两次相同查询的结果可能会因为其他事务提交的数据变化而不同,即解决了脏读问题,但可能出现不可重复读(Non-Repeatable Read)。
- 这个级别禁止了一个事务读取另一个事务未提交的数据,提高了数据一致性。
可重复读(Repeatable Read):
- 这是MySQL的默认事务隔离级别。
- 在该级别下,同一个事务内的多次查询始终能看到同样的数据,即使其他事务在这段时间内对这些数据进行了提交,即解决了脏读和不可重复读的问题。
- 然而,在可重复读隔离级别下,由于对已提交数据的版本控制(MVCC,多版本并发控制),依然有可能出现幻读(Phantom Read)现象,即在同一事务中连续两次执行相同的查询,第二次查询结果中出现了第一次查询时还未存在的行。
串行化(Serializable):
- 这是最严格的隔离级别,通过完全锁定读取的行来避免所有并发问题,即解决了脏读、不可重复读和幻读问题。
- 在这个级别下,事务之间几乎是串行化的执行,极大的保证了数据的一致性,但并发性能最低,可能导致大量的锁等待和冲突。
2pc, 3pc 算法
2PC (Two-Phase Commit) 和 3PC (Three-Phase Commit) 是分布式数据库系统中用于确保在多个参与者之间原子地提交或回滚事务的协议。它们主要用于解决分布式事务中的数据一致性问题。
两阶段提交 (2PC)
阶段一:准备阶段(Prepare Phase)
- 协调者(Coordinator)向所有参与者(Participants)发送事务准备消息,并询问是否可以提交事务。
- 参与者执行事务操作,并锁定相关资源,但不提交事务;如果参与者认为事务不能成功,则它会反馈“否”给协调者。
- 参与者在这个阶段后处于阻塞状态,等待协调者的最终决定。
阶段二:提交/回滚阶段(Commit/Rollback Phase)
- 如果所有参与者都反馈可以提交,协调者向所有参与者发送正式的提交消息,参与者完成事务提交并释放资源。
- 若任何一个参与者反馈不能提交,或者在第一阶段超时未收到响应,协调者则向所有参与者发送回滚消息,参与者撤销其事务操作并释放资源。
缺点:
- 单点故障:协调者在整个过程中扮演关键角色,一旦协调者失败,可能造成整个系统无法确定事务的状态。
- 持久阻塞:在协调者崩溃且部分参与者未收到第二阶段的消息时,参与者可能会长时间锁定资源。
三阶段提交 (3PC)
阶段一:预提交(CanCommit Phase)
- 类似于2PC的第一阶段,协调者询问所有参与者是否可以提交事务,参与者根据自身情况做出初步决策。
阶段二:预提交确认(PreCommit Phase)
- 如果所有参与者在第一阶段答复可以提交,协调者通知所有参与者进入预提交状态,参与者开始写入日志记录即将提交的事务,并做好提交准备。
- 同时,协调者也记录下自己的决策,这样即使它在此阶段失败,可以根据日志恢复状态。
阶段三:提交/回滚阶段(DoCommit Phase)
- 如果协调者收到了所有参与者的预提交确认,它将发出正式的提交指令。
- 如果在第二阶段协调者发现有参与者不同意提交,则直接发送回滚指令。
优点:
- 相对于2PC,3PC引入了额外的预提交阶段,减少了长时间锁定资源的可能性,降低了协调者单点故障导致的问题影响程度。
缺点:
- 虽然减少了阻塞时间,但仍然存在网络延迟和故障带来的不确定性问题。
- 增加了通信复杂度,交易成本相对更高。
最后编辑: kuteng 文档更新时间: 2024-04-02 09:53 作者:kuteng