mysql事务未提交读_MySql事务隔离级别:读未提交(Read uncommitted)、读已提交(Read committed)、可重复读(Repeatable read)、可串行化(Seria...

一、MySql事务隔离级别

隔离级别

脏读

不可重复读

幻读

读未提交(Read uncommitted)

可能

可能

可能

读已提交(Read committed)

不可能

可能

可能

可重复读(Repeatable read)

不可能

不可能

可能

可串行化(Serializable )

不可能

不可能

不可能

二、事务隔离级别的描述

1、读未提交(Read uncommitted)

在一个事务a执行过程中可以读取到其它事务中编辑后的数据,尽管其它事务还没有提交。

当事务a中读取到了事务b编辑后的数据后,事务b做了回滚操作。那么事务a读取到的数据就是脏数据(脏读);

当事务a在执行过程中对同一条查询语句执行了多次,但由于事务b在事务a多次查询过程中新增(insert)了数据,造成事务a多次查询的结果不一致,那么事务a的多次查询结果不一致的情况就是幻读;

当事务a在执行过程中对同一条查询语句执行了多次,但由于事务b在事务a多次查询过程中修改(update)或者删除(delete)了数据,造成事务a多次查询的结果不一致,那么事务a的多次查询结果不一致的情况就是不可重复读;

2、读已提交(Read committed)

在一个事务a执行过程中可以读取到其它事务编辑并提交(commit)后的数据,如果其它事务没有提交,则获取不到。

当事务a在执行过程中对同一条查询语句执行了多次,但由于事务b在事务a多次查询过程中修改(update)或者删除(delete)了数据,造成事务a多次查询的结果不一致,那么事务a的多次查询结果不一致的情况就是不可重复读;

在将MySql的事务隔离级别改为读已提交(Read committed)的时候,需要修改my.cnf配置文件,将二进制日志(bin log)存储格式改成ROW。并且隔离锁将失效。

3、可重复读(Repeatable read)

是MySql的默认事务隔离级别,在一个事务a执行过程中对同一条查询sql语句执行结果都是一样的,不受其它事务的影响。

当事务a在执行过程中对同一条查询语句执行了多次,但由于事务b在事务a多次查询过程中新增(insert)了数据,造成事务a多次查询的结果不一致,那么事务a的多次查询结果不一致的情况就是幻读;

where 范围操作的时候会产生隔离锁。 例如:update student set name = '小王' where id > 5 and id < 10;

隔离锁锁住的是id小于5的哪条数据 至  id大于10之间的数据。例如id在表中的值有(1,2,20,30),那么上面的sql语句锁住的范围未2 - 20之间。对于insert的隔离锁没有这种限制。

可使用(排他锁)for update或者共享锁(lock in share mode)来避免幻读:select * from table where id = 1  for update ;   或者select * from table where id = 1  lock in share mode;

4、可串行化(Serializable )

于可重复度(Repeatable read)比较接近,当autocommit被禁用后,innodb存储引擎会将每个select语句后面都加上 lock in share mode(共享锁);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值