MySQL事务脏读、不可重复读、幻读

79 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第12天,点击查看活动详情

数据库什么时候出现事务

这条更新语句,有事务吗?

update student set sname = '猫老公 111' where id=1;

它自动开启了一个事务,并且提交了。

这个是开启事务的第一种方式,自动开启和自动提交。

InnoDB 里面有一个autocommit的参数(分成两个级别,session级别和global级别)。

show variables like 'autocommit';

它的默认值是ON。autocommit这个参数是什么意思呢?是否自动提交。如果它的值是true/on的话,我们在操作数据的时候,会自动开启一个事务,和自动提交事务。

事务并发带来的问题

脏读不可重复读幻读

image.png

第一个事务里面,它首先通过一个where id=1的条件查询一条数据,返回name=abc,age=16的这条数据。

第二个事务,它同样地是去操作id=1的这行数据,它通过一个update的语句,把这行 id=1 的数据的 age 改成了18,没有提交

这个时候,在第一个事务里面,它再次去执行相同的查询操作,发现数据发生了变化,获取到的数据age变成了18。这种在一个事务里面,由于其他的时候修改了数据并且没有提交,而导致了前后两次读取数据不一致的情况,叫做脏读


image.png

同样是两个事务,第一个事务通过 id=1 查询到了一条数据。然后在第二个事务里面执行了一个update 操作,通过一个commit提交了修改。然后第一个事务读取到了其他事务已提交的数据导致前后两次读取数据不一致的情况。那么这种事务并发带来的问题,叫做不可重复读


image.png

第一个事务里面我们执行了一个范围查询,这个时候满足条件的数据只有一条。

第二个事务里面,它插入了一行数据,并且提交了。重点:插入了一行数据。在第一个事务里面再去查询的时候,它发现多了一行数据。

一个事务前后两次读取数据数据不一致,是由于其他事务插入数据造成的,这种情况我们把它叫做幻读。