[高性能MYSQL学习笔记]事务

MySQL
345
0
0
2022-04-14
标签   MySQL事务

彻底了解MYSQL事务
那些原子性,一致性,隔离性,持久性就不说了,主要说说innodb存储引擎下面的事务

一. 隔离级别

Mysql的默认隔离级别是 REPEATABLE-READ (可重复读) 可以通过一下命令查看和修改

show variables like '%tx_isolation%' //查看
set global transaction isolation level read committed; //全局永久修改
set session transaction isolation level read committed;//修改当前会话

先来说说四个隔离级别

READ UNCOMMITTED (未提交读)   不常用
除非真的有必要,实际应用中一般很少使用
假设现在两个事务A,B同时开启
事务A BEGIN之后  COMMIT之前  所做的INSERT,UPDATE,DELETE操作
事务B 都能SELECT到  
事务A 如果ROLLBACK,所做的INSERT,UPDATE,DELETE回滚 
事务B 刚刚SELECT的数据就是脏数据   简称 脏读
SERIALIZABLE (可串行化)   不常用
最高级别事务,强制事务一个个地执行,同一个时间一个表只允许一个事务在执行
事务读取到的数据都会加上行锁,导致其他非事务的查询不能正常执行,除非非常需要保证数据一致性,才考虑采用这个级别
 READ COMMITTED (提交读)  支持MVCC
 假设现在两个事务A,B同时开启
 事务A BEGIN之后  COMMIT之前  所做的INSERT,UPDATE,DELETE操作
 事务B都查不到,此时事务B查到的是事务A开启之前的参数
 假设现在事务A COMMIT了,事务B还没COMMIT,问题来了
 事务B第二次去SELECT就可以SELECT到事务A提交的数据了
 导致了同一个事务里面两次相同的SELECT,得到的结果不一致 简称不可重复读
 可能会导致一些奇怪的事情
REPEATABLE READ (可重复读) MYSQL INNODB 默认隔离级别 支持MVCC
INNODB通过MVCC(多版本并发控制)解决了上面的不可重复读问题
事务A BEGIN后, COMMIT之前,对每一行的INSERT,UPDATE,DELETE操作都会产生一条新的数据行,版本号是当前事务的ID,不影响原始的数据行
事务B 此时BEGIN 如果读到有多版本的数据行(其他事务有INSERT,UPDATE,DELETE过的),也会对此数据行添加自己的版本号

结语

本文持续更新修正