事务 要么全部成功,要么全部失败
遵循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的实现基础