MySQL事务隔离级别
2024-01-02 16:53:47
隔离级别
读取未提交(READ-UNCOMMITTED)
最低的隔离级别,允许读取尚未提交的数据变更,可能造成脏读、不可重复读、幻读。
读取已提交(READ-COMMITTED)
允许读取并发事务已经提交的数据,可以避免脏读,但是可能造成不可重复、幻读。
可重复读(REPEATABLE-READ)
对同一字段多次读取的结果都是一致的,除非本身事务修改,可以避免脏读和不可重复读,但是可能造成幻读。(MySQL InnoDB存储引擎默认的事务隔离级别是可重复读)
可串行化(SERIALIZABLE)
最高的隔离级别,完全服从ACID的隔离级别,读写操作都会加锁,多个事务要访问同一条记录时,要进行排队,优先级低的事务必须等优先级高的事务完成以后才能进行。所有的事务依次执行,可以避免脏读、不可重复读、幻读。
事务隔离级别可能引发的问题
脏读
脏读就是读取到未提交的数据, 比如如下代码
#先设置事务隔离级别为读取未提交,然后开启事务
start transaction;
#A事务进行金额交易
update account set money = money - 1000 where id = 1;
update account set money = money + 1000 where id = 2;
#B事务查询账户表就会出现脏读(查询到其他事务未提交的数据)
#A事务执行回滚,数据就会还原了.
不可重复读
#先设置事务隔离级别为读取已提交,然后开启事务
start transaction;
#B事务查询id = 1 数据的金额
select * from account where id = 1;
#A事务进行金额交易
update account set money = money - 1000 where id = 1;
update account set money = money + 1000 where id = 2;
#A事务提交
#B事务还未进行提交事务又进行查询id = 1发现数据变化
select * from account where id = 1;
#在一次事务中多次查询数据不一致则是不可重复读问题
幻读
一般出现在删除和新增情况
#先设置事务隔离级别为可重复读,然后开启事务
start transaction;
#比如说用户表有两条数据,有一个是否完整的字段, 根据name和address判断, 如果都有则赋值完整
#A事务查询有数据符合赋值完整的数据,还未进行事务提交
#B事务有插入一条符合赋值完整的数据,在A事务提交之前提交了.
#A事务提交之后发现又有一条可以赋值的数据,此现象就称为幻读
隔离级别总结
从上到下,隔离级别依次变高,但是性能也依次变差。隔离级别对应出现的问题
隔离级别 | 是否出现脏读 | 是否出现不可重复读 | 是否出现幻读 |
---|---|---|---|
读取未提交 | 是 | 是 | 是 |
读取已提交 | 否 | 是 | 是 |
可重复读 | 否 | 否 | 是 |
可串行化 | 否 | 否 | 否 |
事务隔离级别设置语句
查询数据库隔离级别
SELECT @@TX_ISOLATION;
修改数据库隔离级别
SET GLOBAL TRANSACTION ISOLATION LEVEL 级别字符串;
文章来源:https://blog.csdn.net/zc_huiyanruju/article/details/135294383
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!