MySQL事务
事务的四大特性(ACID)
- Atomicity(原子性)
表示一个事务内的所有操作是一个整体,要么全部成功,要么全部失败 - Consistency(一致性)
表示一个事务内有一个操作失败时,所有的更改过的数据都必须回滚到修改前状态 - Isolation(隔离性)
事务查看数据操作时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。 - Durability(持久性)
持久性事务完成之后,它对于系统的影响是永久性的。
事务隔离级别(由低到高):
- 读未提交 read uncommitted:
提供了事务之间最小限度的隔离,可以读到其他事务还没有提交的数据。 - 读已提交 read committed:
可以看到其他事务对数据的修改,在事务A处理期间,如果事务B修改了相应的表,那么同一个事务的多个 SELECT 语句可能返回不同的结果。 - 可重复读 repeatable read(InnoDB默认级别):
指是在一个事务内,最开始读到的数据和事务结束前的任意时刻读到的同一批数据都是一致的。当前正在执行事务的变化不能被外部看到。 - 序列化 serializable:
最高的事务隔离级别,事务序列化,只能一个接着一个地执行,不能并发执行,同时代价也是最高的,性能很低,一般很少使用。
脏读:A事务读到了B事务还没提交的数据。
不可重复读:A事务先后读取同一条记录,但两次读取的数据不同。即A事务看到了B事务提交后的数据。
幻读:A事务读到了B事务未提交的数据,删又删不掉。
幻读和不可重复读都是在同一个事务中多次读取了其他事务已经提交的事务的数据导致每次读取的数据不一致,不同的是不可重复读读取的是同一条数据,而幻读针对的是一批数据整体的统计(比如数据的个数)。
隔离级别(由低到高) | 解决脏读问题? | 解决不可重复读问题? | 解决幻读问题? |
---|---|---|---|
读未提交 | X | X | X |
读已提交 | V | X | X |
可重复读 | V | V | X |
串行化 | V | V | V |
InnoDB的可重复读级别通过MVCC机制解决了幻读问题。
MVCC
多版本并发控制(Multi-Version Concurrency Control) ,只在InnoDB引擎下存在。是行级锁的一个变种,但是它在很多情况下避免了加锁操作,因此开销更低。
MVCC最大的好处:读不加锁,读写不冲突。
实现机制:InnoDB在每行数据都增加三个隐藏字段,一个唯一行号,一个记录创建的版本号,一个记录回滚的版本号。
快照读(SnapShot Read)是一种一致性不加锁的读,是 InnoDB 存储引擎并发如此之高的核心原因之一。读取的是快照版本,也就是历史版本。通过MVCC和undo log来实现的。
当前读(current read):读取的是最新版本。通过加record lock(记录锁)和gap lock(间隙锁)来实现的。
undo log是为回滚而用,具体内容就是copy事务前的数据库内容(行)到undo buffer,在适合的时间把undo buffer中的内容刷新到磁盘。
本文作者:Ritchie
本文链接:https://www.cnblogs.com/wang-zeyu/p/17108283.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。