当前位置:   article > 正文

mysql数据库的四种隔离级别_mysql 隔离级别

mysql 隔离级别

我们知到MySQL数据库有四种隔离级别,分别是:读未提交(read uncommitted )、读已提交(read committed)、可重复读(repeatable read)、序列化\串行化(serializable)。

首先在讲隔离级别,这几个命令必须会用:

查看事务隔离级别:

select @@tx_isolation;(这是MySQL5点几版本使用的)

select @@transaction_isolation;(这是MySQL8点几的版本使用)

根据你自身MySQL的版本号选用对应的代码。

设置事务隔离级别:

set global transaction isolation level 隔离级别;

开启事务: (MySQL默认自动提交,所以我们要开启事务手动提交)

start transaction;

提交事务:(DML语句执行完之后会保存在事务性的活动日志文件,需要提交之后才会保存到数据中)

commit;

回滚事务:(将执行的DML语句回滚回来,相当于之前的DML语句作废)

rollback;

下面我先从最低的隔离级别开始:

读 未提交(read uncommitted):

假如A事务和B事务对同一张表进行操作,B事务进行了DML语句,但没有提交(commit)或者回滚(rollback),此时A事务便可以查看到B事务还没有提交的数据,就是保存在事务性活动的日志文件中的数据。这样可能会造成脏读。何为脏读:脏读就是B事务还没有提交的数据,A事务便可以查看到,在用户的眼里,A用户就会以为这条数据已经存在了,其实还没有提交,如果提交失败,便会回滚,这条数据并没有添加成功,而A用户却以为成功了。

这里你需要自己改以下隔离级别  set global transaction isolation level 隔离级别; 最后再退出数据库,再重新进入。

 

读 已提交(read committed):

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

 

 可重复读(repeatable read):

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

 

 序列化\串行化(serializable):

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

 

总结:这四种隔离级别都有自己的优势,读未提交级别的效率最高,但是会脏读;读以提交不会脏读,但不可重复读;可重复读会幻读;串行化的效率太低,且非全安全,不适合多线程。一般建议使用可重复读,也就是MySQL中默认的隔离级别。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/924672
推荐阅读
相关标签
  

闽ICP备14008679号