事物的四个隔离级别
- 读未提交 read uncommitted
事物未提交时,其他事物就可以读取未提交的数据,会造成脏读,很少用
- 读已提交 read committed
只能读取事物提交后的数据,避免脏读,也叫不可重复读
- 可重复读 repeatable read
在同一事物中多次读取同样记录结果是一致的,造成幻读
- 串行化 serializable
强制事物串行执行,避免了幻读,会在读取时给每一行加锁,导致大量超时和锁争用问题
MVCC:多版本并发控制(Multiversion Concurrency Control)
- 读锁S锁(共享锁)
A事物在读取时会给数据添加读锁,A和其他事物可以读取,不能修改,在A事物释放读锁前,其他事物读取数据时只能再次加S锁,只有A事物释放S锁之后才能对数据做修改
- 写锁X锁(排他锁)
A事物对数据对象加上X锁,其他事物在X锁释放前不能对数据对象进行读写操作,A事物可对数据对象进行读写操作。
X锁又有表锁,行锁
- MVCC的相关字段
在innodb中行记录除了基础数据信息外,还有两个字段记录事物Data_Trx_id 和 Data_roll_ptr Data_trx_id 表示最后一次进行修改记录的事物id Data_roll_ptr:表示回滚段,记录对应 undo.log中的 本行修改前的信息
数据库的四个基本要素(acid)
- 原子性
一个事物的所有操作,要么全部完成,要么全部失败,不会结束在中间环节。执行中发生错误,会被回滚到事物开始前的状态(undo.log)。
- 一致性
在事物开始之前和事物结束后,数据库的数据完整性没有被破坏。主要保护性和不变性。如:多个账户进行互相转账操作,并发事物结束后,账户总金额保持不变。
- 隔离性
允许多个事物对数据库并发进行读写的能力,防止事物并发执行时由于交叉执行导致的数据不一致
- 持久性
事物结束后,对数据的修改就是永久的,可以理解为保存在物理内存中 [参考]:www.cnblogs.com/kismetv/p/1…