Mysql事务并发带来的问题

1,脏读

A事务读取B事务尚未提交的更改数据,并在这个数据基础上操作。如果B事务回滚,那么A事务读到的数据根本不是合法的,称为脏读。在oracle中,由于有version控制,不会出现脏读。

第一个窗口:
set session transaction isolation level read uncommitted;
set global transaction isolation level read uncommitted;
set autocommit = 0;
insert into student values(4, 'zhaoxin');
rollback;
第二个窗口:
select * from student;
image.png

设置数据库的隔离级别为:读已提交(read committed)可解决这个问题

set session transaction isolation level read committed;
set global transaction isolation level read committed;
image.png

2,不可重复读

A事务读取了B事务已经提交的更改(或删除)数据。比如A事务第一次读取数据,然后B事务更改该数据并提交,A事务再次读取数据,两次读取的数据不一样。

第一个窗口:
set session transaction isolation level read committed;
set global transaction isolation level read committed;
set autocommit = 0;
select * from student;
select * from student;
commit;
第二窗口:
update student set name='zhangsan333333' where id = 3;
image.png

3,幻读

幻读,并不是说两次读取获取的结果集不同,幻读侧重的方面是某一次的 select 操作得到的结果所表征的数据状态无法支撑后续的业务操作。更为具体一些:select 某记录是否存在,不存在,准备插入此记录,但执行 insert 时发现此记录已存在,无法插入,此时就发生了幻读。
幻读错误的理解:说幻读是 事务A 执行两次 select 操作得到不同的数据集,即 select 1 得到 10 条记录,select 2 得到 11 条记录。这其实并不是幻读,这是不可重复读的一种,只会在 R-U R-C 级别下出现,而在 mysql 默认的 RR 隔离级别是不会出现的。


image.png

你可能感兴趣的:(Mysql事务并发带来的问题)