事务隔离级别(tx_isolation)
mysql 有四级事务隔离级别 每个级别都有字符或数字编号
级别 | symbol | 值 | 描述 |
---|---|---|---|
读未提交 | READ-UNCOMMITTED | 0 | 存在脏读、不可重复读、幻读的问题 |
读已提交 | READ-COMMITTED | 1 | 解决脏读的问题,存在不可重复读、幻读的问题 |
可重复读 | REPEATABLE-READ | 2 | mysql 默认级别,解决脏读、不可重复读的问题,存在幻读的问题。使用 MMVC机制 实现可重复读 |
序列化 | SERIALIZABLE | 3 | 解决脏读、不可重复读、幻读,可保证事务安全,但完全串行执行,性能最低 |
我们可以通过以下命令 查看/设置 全局/会话 的事务隔离级别
SELECT @@global.tx_isolation, @@tx_isolation;
@@global.tx_isolation | @@tx_isolation |
---|---|
REPEATABLE-READ | REPEATABLE-READ |
丢失修改:指两个事务T1和T2从数据库中读入同一数据并修改,T2的提交结果破坏了T1提交的结果,导致T1的修改被丢失
不可重复读:不可重复读是指事务T1读取数据后,事务T2执行更新操作,使T1无法再现前一次读取结果。
不可重复读包括三种情况:
事务T1读取某一数据后,事务T2对其做了修改,
当T1再次读该数据时,得到与前一次不同的值。
事务T1按一定条件从数据库中读取了某些数据记录后,事务T2删除了其中部分记录,当T1再次按相同条件读取数据时,发现某些记录神密地消失了。
事务T1按一定条件从数据库中读取了某些数据记录后,事务T2插入了一些记录,当T1再次按相同条件读取数据时,发现多了一些记录。
后两种情况也称为幻影现象(Phantom Row)。
脏读:读“脏”数据:事务T1修改某一数据,并将其写回磁盘,事务T2读取同一数据后,T1由于某种原因被撤消,这时事务1已修改过的数据恢复原值,T2读到的数据就与数据库中的数据不一致,则T2读到的数据称为“脏”数据。
e.g:丢失修改
image幻读:
幻读,并不是说两次读取获取的结果集不同,幻读侧重的方面是某一次的 select 操作得到的结果所表征的数据状态无法支撑后续的业务操作。更为具体一些:select 某记录是否存在,不存在,准备插入此记录,但执行 insert 时发现此记录已存在,无法插入,此时就发生了幻读。
不可重复读侧重表达 读-读,幻读则是说 读-写
MVCC (Multiversion concurrency control) 多版本并发控制
网友评论