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过的),也会对此数据行添加自己的版本号
评论区(0)