MySQL 事务

  • 事务特性 ACID
  • 事务隔离中的脏读、幻读问题
  • 隔离级别

一、事务特性 ACID

【原子性】Atomicity

一个事务内多个操作语句,不可被分割。(一个事务的执行结果,要么全部成功,要么全部失败)

【一致性】Consistency

一个事务操作之后, 数据库所处的状态和业务规则是一致的。

【隔离性】Isolation
多个事务之间相互独立,不能相互影像。
但实际数据实现分为不同级别:

  • 未提交(Read UnCommitted)
  • 读提交(Read Committed)
  • 可重复读(Repeatable Read)
  • 串行化(Serializable)

【持久性】Durability,

  • 事务提交后被持久化,永久存储.

二、脏读、幻读问题

【脏读】
读到了别人没提交的数据,别人没有做commit操作的数据被读取。

其他事务未提交的数据 ,被当前事务提取。

【幻读】
同样的条件的select, 第1次和第2次读出来的记录数不一样。幻读的重点在于新增或者删除。

同一个事务中,多次执行同一个select。 读取到的数据行数发生改变。也就是数据行数减少或者增加了 (被其它事务delete/insert并且提交)。

【不可重复读】:
不可重复读的重点是修改,同样的条件的select, 你读取过的数据, 再次读取出来发现值不一样了

同一个事务中,多次执行同一个select。读取到的数据发生了改变(被其它事务update并且提交)。

【可重复读】

同一个事务中,多次执行同一个select。读取到的数据没有发生改变(一般使用MVCC实现);

三、事务隔离级别

隔离级别,研究在同一个事务内,两次执行查询 select 出现的不一致容忍度问题;
【脏读】、【不可重复读】、 【幻读问题】

简写隔离级别 Isolation Level中文脏度 Dirty Read不可重复读 Unrepeatable Read幻读 Phantom Read
RURead UnCommited读取未提交数据
RCRead Commited读取提交数据
RRRead Repetable可重复读
SSerializable串行

从上表可以看出:
- RC 容忍【不可重复读】、【幻读】。
- RR 仅容忍 【幻读】。
- 但MySQL 在具体实现上会有差异。

3.1 Mysql 与 Oracle 差异
MySQL 默认采用RR隔离级别之外,其它几大数据库都是采用RC隔离级别。

Oracle 仅实现了 RC 、SERIALIZABLE 隔离级别。

  • 默认采用RC隔离级别,解决了脏读。但容忍《不可重复读》和《幻读》。
  • 其SERIALIZABLE 解决了脏读、不可重复读、幻读。

MySQL 默认采用 RR 隔离级别。

  • RR 解决不可重复读的问题,但MySQL 采用了gap lock,所以实际上MySQL的RR隔离级别也解决了幻读的问题。
  • SERIALIZABLE采用了经典的实现方式,对读和写都加锁。

3.2 RC 于 RR 区别

在 Where条件过滤时 ;

  • RC 隔离级别,对不符合条件的记录,锁会释放掉,

  • RR 隔离级别,对不符合条件的记录,锁不一定会释放 (虽然违反了“2阶段锁”原则)

  • 下面是官方文档中的说明:http://dev.mysql.com/doc/refman/5.6/en/innodb-locks-set.html

四、 间隙锁 gap lock

参考:

  • https://blog.csdn.net/u014066037/article/details/68941287
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值