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中默认的隔离级别。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值