mysql 事务隔离级别
事务隔离级别
3.1、数据并发问题
脏写( Dirty Write )
对于两个事务 Session A、Session B,如果事务Session A修改了另一个未提交事务Session B修改过的数据,那就意味着发生了脏写
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ssTpltbB-1661608724716)(https://cdn.jsdelivr.net/gh/aoshihuankong/cloudimg@master/img/202204031124086.png)]
脏读( Dirty Read )
对于两个事务 Session A、Session B,Session A读取了已经被 Session B更新但还没有被提交的字段。之后若 Session B回滚,Session A读取的内容就是临时且无效的。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6BR1bIhV-1661608724717)(https://cdn.jsdelivr.net/gh/aoshihuankong/cloudimg@master/img/202204031124136.png)]
不可重复读( Non-Repeatable Read )
对于两个事务Session A、Session B,Session A读取了一个字段,然后 Session B更新了该字段。 之后Session A再次读取同一个字段,值就不同了。那就意味着发生了不可重复读。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1v6cvYWu-1661608724718)(https://cdn.jsdelivr.net/gh/aoshihuankong/cloudimg@master/img/202204031124331.png)]
幻读( Phantom )
对于两个事务Session A、Session B, Session A 从一个表中读取了一个字段, 然后 Session B 在该表中插入了一些新的行。 之后, 如果 Session A再次读取同一个表, 就会多出几行。那就意味着发生了幻读。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RPLkJgD4-1661608724719)(https://cdn.jsdelivr.net/gh/aoshihuankong/cloudimg@master/img/202204031125847.png)]
注意1:
有的同学会有疑问,那如果Session B中剔除了一些符合studentno > 0的记录而不是插入新记录,那么Session A之后再根据studentno > 0的条件读取的记录变少了,这种现象算不算幻读呢?这种现象不属于幻读,幻读强调的是一个事物按照某个相同条件多次读取记录时,后读取时读到了之前没有读到的记录。
注意2:
那对于先前已经读到的记录,之后又读取不到这种情况,算啥呢?这相当于对每一条记录都发生了不可重复读的现象。幻读只是重点强调了读取到之前读取没有获取到的记录。
3.2 SQL中的四种隔离级别
SQL标准中设立了4个隔离级别:
READ UNCOMMITTED:读未提交,在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。不能避免脏读、不可重复读、幻读。
READ COMMITTED:读已提交,它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。可以避免脏读,但不可重复读、幻读问题仍然存在。
REPEATABLE READ:可重复读,事务A在读到一条数据之后,此时事务B对该数据进行了修改并提交,那么事务A再读该数据,读到的还是原来的内容。可以避免脏读、不可重复读,但幻读问题仍然存在。这是MySQL的默认隔离级别。
SERIALIZABLE:可串行化,确保事务可以从一个表中读取相同的行。在这个事务持续期间,禁止其他事务对该表执行插入、更新和删除操作。所有的并发问题都可以避免,但性能十分低下。能避免脏读、不可重复读和幻读。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kJOsKCAa-1661608724719)(https://cdn.jsdelivr.net/gh/aoshihuankong/cloudimg@master/img/202204031127542.png)]
3.3、如何设置事务的隔离级别
SET [GLOBAL|SESSION] TRANSACTION ISOLATION LEVEL 隔离级别;
#其中,隔离级别格式:
> READ UNCOMMITTED
> READ COMMITTED
> REPEATABLE READ
> SERIALIZABLE
或者:
SET [GLOBAL|SESSION] TRANSACTION_ISOLATION = '隔离级别'
#其中,隔离级别格式:
> READ-UNCOMMITTED
> READ-COMMITTED
> REPEATABLE-READ
> SERIALIZABLE
免责声明:
1、本站资源由自动抓取工具收集整理于网络。
2、本站不承担由于内容的合法性及真实性所引起的一切争议和法律责任。
3、电子书、小说等仅供网友预览使用,书籍版权归作者或出版社所有。
4、如作者、出版社认为资源涉及侵权,请联系本站,本站将在收到通知书后尽快删除您认为侵权的作品。
5、如果您喜欢本资源,请您支持作者,购买正版内容。
6、资源失效,请下方留言,欢迎分享资源链接
文章评论