一文搞懂mysql的事务隔离级别

1.事务的概念以及特性

1.1)概念,一个或者一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行。

1.2)特性
1.2.1) 原子性,原子性是指事务是一个不可分割的工作单位,事务中的操作要么都执行,要么都不执行。
1.2.2) 一致性,一个事务执行会使数据从一个一致状态切换到另外一个一致状态。
1.2.3) 隔离性,一个事务的执行不应该受到其他事务的干扰。
1.2.4) 持久性,一个事务一旦提交,则会永久地改变数据库的数据。

2.线程并发带来的问题

2.1)脏读(相对于更新数据时出现)
对于两个事务T1,T2,T1读取了T2更新但是没有提交的字段,之后,若是T2回滚了,T1读取的内容就是临时无效的。

2.2)不可重复读
对于两个事务T1,T2,T1读取了表的一个字段,然后T2更新了该字段之后,T1再次读取同一个字段,值就不同了。

2.3)幻读(相对于插入数据时出现)
对于两个事务T1,T2,T1从一个表中了读取了一个字段,然后T2在该表插入了一些新的行,之后,如果T1再次读取这个表的数据,就会多出几行。

3.脏读,不可重复读和幻读的演示

前提:mysql肯定要装!!!如下要以终端的形式打开两个窗口,来代表两个事务,还有要修改mysql中的事务隔离级别,演示脏读时,隔离级别改为读未提交(read uncommitted),演示不可重复读时,隔离级别改为读已提交(read committed),演示幻读时,隔离级别修改为可重复读(repeatable read)!
在这里插入图片描述

3.1)脏读
3.1.1)查看当前会话的隔离级别,select @@transaction_isolation;
在这里插入图片描述

3.1.2)设置两个会话的事务的隔离级均为别为读未提交(read uncommitted)

在这里插入图片描述

3.1.3)会话1修改name张三为’zhangsan‘,但是并没有提交,会话2确读到了修改后的数据,但是会话1可能回滚,导致会话2前后两次读到的数据不一致,这样的情况就为脏读
回滚前
在这里插入图片描述
回滚后
在这里插入图片描述

3.2)不可重复读
3.2.1)设置两个会话的事务隔离级别为read committed
在这里插入图片描述

3.2.2)read commited 解决了脏读的现象
在这里插入图片描述

3.2.3)解决不了不可重复读的现象,前后两次读取到的数据不一致
在这里插入图片描述

3.3)幻读
3.3.1)设置两个会话的事务隔离级别为repeatable read
在这里插入图片描述

3.3.2)repeated read可以解决脏读和不可重复读的现象
解决了脏读
在这里插入图片描述
解决了不可重复读
在这里插入图片描述

3.3.3)但是解决不了幻读的现象
在这里插入图片描述

4.四种事务隔离级别介绍

4.1)读未提交(read uncommitted),允许事务读取未被其他事务提交的变更,脏读,重读读,幻读问题都会出现。

4.2)读已提交(read committed),只允许事务读取已经被其他事务提交的变更,可以避免脏读,但是重复读,幻读会出现。

4.3)可重复读(repeatable read),确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其他事务对这个字段进行更新,可以避免脏读,重复读,但是幻读会出现(mysql中默认的事务隔离级别)。

4.4)可串行化(serializable),确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其他事务对这个表进行插入,更新,删除操作,所有并发的问题都可以解决,但是性能非常低。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值