数据库的默认隔离级别

数据准备
在这里插入图片描述

数据并发问题

脏写(Dirty Write)

对于两个事务sessionA、sessionB,如果事务A修改了事务B修改过的数据那就意味着发生了脏写
在这里插入图片描述

脏读(Dirty read)

对于两个事务sessionA、sessionB,sessionA读取了sessionB更新但是还未提交的字段,之后sessionB回滚,sessionA读取的内容就是临时且无效的。
在这里插入图片描述

不可重复读(Non-Repeatable Read)

对于两个事务sessionA、sessionB,sessionA读取了一个字段,然后sessionB更新了该字段。之后sessionA再次读取同一个字段,值就不同了。就意味着发生了不可重复读。
在这里插入图片描述

幻读(phantom)

对于两个事务sessionA、sessionB,sessionA从一个表中读取了一个字段,然后sessionB在该表中插入了一些新的行。之后sessionA再次读取就会多出几行。那就意味着发生了幻读。
在这里插入图片描述
在这里插入图片描述

mysql的四种隔离级别

1.读未提交(Read uncommitted);

假如A事务和B事务对同一张表进行操作,B事务进行了DML(INSERT、UPDATE、DELETE)语句,但没有提交(commit)或者回滚(rollback),此时A事务便可以查看到B事务还没有提交的数据,就是保存在事务性活动的日志文件中的数据。这样可能会造成脏读。何为脏读:脏读就是B事务还没有提交的数据,A事务便可以查看到,在用户的眼里,A用户就会以为这条数据已经存在了,其实还没有提交,如果提交失败,便会回滚,这条数据并没有添加成功,而A用户却以为成功了。
这里你需要自己改以下隔离级别 set global transaction isolation level 隔离级别; 最后再退出数据库,再重新进入。

2.读已提交(Read committed);

假如A事务和B事务对同一张表进行操作,B事务进行了DML语句,但没有进行提交,那么A事务是读取不到的,它解决了脏读,但是出现了不可重复读

3.可重复读(Repeatable read),数据库默认开启;

A事务读取不到B事务还没有提交的数据;解决了不可重复读,但会造成幻影读(幻读),数据不够真实。mysql中默认的事务隔离级别就是这个。

4.序列化\串行化(Serializable )

这个隔离级别是最高级别,效率最低,但是非常安全,不能并发,俩个事务不能对同一张表进行操作,需要等待A事务操作完之后,B事务才能进行操作。每次读取的数据都是最真实的。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐