MySql数据库的事务隔离级别学习
一、Mysql事务的隔离级别分为
- 读未提交
- 读已提交
- 可重复读
- 串行化
1、读未提交
事务A可以读取到事务B未提交的数据
设置MySql数据库的隔离级别
set SESSION TRANSACTION ISOLATION LEVEL READ uncommitted
查看当前数据库事务隔离级别
select @@tx_isolation;
客户端A使用事务查询数据
BEGIN SELECT * FROM tb_demo
查询结果
客户端B使用事务更新(并未提交事务)
BEGIN update tb_demo set math = 4000
客户端A再次查询得到结果,可以发现A可以查询到B未提交的数据
读未提交会产生幻读,不可重复读,脏读的问题
2、读已提交
设置事物的隔离级别为读已提交
set SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED
客户端A使用事务查询数据
BEGIN
SELECT * FROM tb_demo
查询结果
客户端B使用事务更新(并未提交事务)
BEGIN update tb_demo set math = 100
客户端A再次查询得到结果,可以发现A查询不到B未提交的数据
客户端B提交事务
COMMIT
客户端A再次查询结果(客户端A能够读取到B已经提交的数据)
读已提交可以解决脏读 存在不可重复读,幻读问题
3、可重复读
设置数据库的隔离级别
set session TRANSACTION ISOLATION LEVEL REPEATABLE read
客户端A查询数据
begin select * from tb_demo
客户端B更新数据
BEGIN update tb_demo set math = 100
此时使用客户端A查询数据(数据为之前查询到的数据)
select * from tb_demo
客户端B提交事务
commit
此时使用客户端A再次查询数据(数据依然为之前查询到的数据)在整个事务中读取到的数据不会改变,所以称为可重复读
select * from tb_demo
可重复读解决脏读,不可重复读问题,存在幻读问题
4、串行化
客户端B需等待客户端A事务完成提交后才可继续进行。是完整的隔离级别,会锁定对应的数据表格,因而会有效率的问题。