mysql 事务

事务 要么全部成功,要么全部失败

遵循ACID 原则

原子性

一致性

隔离性

持久性

MySQL的隔离级别 

1,RU 读未提交 可以读取未提交的数据

2,rc 读提交  只能读取已经提交的数据  一般开发设置

3,rr 可重复读  一个事务中,重复读取数据一致,无论其他事务中是否对当前数据做了修改

4,serializable 读写都会加锁

隔离级别脏读不可重复读幻影读
READ-UNCOMMITTED
READ-COMMITTED ×
REPEATABLE-READ × ×
SERIALIZABLE × × ×

 

脏读 读取到未提交的数据

不可重复读 每次读取的数据都不一致, 强调的是修改

幻读 同一事务查询中,两次查询到的数据条数不一致。因其他事务增删导致   强调的是增删

MySQL事务的实现

A 原子性 主要是通过undo Log(回滚日志)实现。当事务回滚时能够撤销所有已经成功执行的sql语句。

innoDB实现回滚,靠的是undo log,当事务对数据进行修改时,innoDB会生成对应的undo log;如果事务执行失败或调用了rollback,

导致事务需要回滚。便可以利用undo log中的信息将数据回滚到修改之前的样子。

C 持久性 通过redolog 实现。MySQL的更新操作都是先写到buffer pool中的,然后再刷新到硬盘中的。

如果宕机的话,buffer pool数据被清空,则可能导致数据丢失。

二阶段提交提交,数据更新在写到buffer pool之前先记录redo log(WAL)。这样在buffer pool数据丢失的时候可以通过redo log获取到更新的内容。

redo log的数据也需要写到磁盘中

为什么redo log 写入磁盘比buffer pool快。redo log是顺序写入的。buffer pool 刷盘的话是以页为单位(默认16k)进行刷盘的。redo log只包含真正需要写入的部分。内容少于buffer pool刷盘

I 隔离性  专注于不同事务之间的影响

写与写之间的隔离 锁来保证

写与读之间的隔离 MVCC保证

D 一致性  数据在事务执行前后都是合法的数据状态

依赖于ACI的实现基础

 

 

 

原文地址:https://www.cnblogs.com/luoying/p/14601895.html