innoDB——数据库锁、隔离级别

概述

数据库锁可以分为:乐观锁和悲观锁。
乐观锁手段:

  1. 版本号
  2. 时间戳
  3. 待更新字段
  4. 所有字段

悲观锁
按性质分:

  • 共享锁
  • 排他锁
  • 更新锁

按作用范围分:

  • 行锁
  • 表锁

事务有四大性质(ACID):1.原子性 2.一致性 3.隔离性 4.持久性
并发操作数据库可能出现的问题:1.第一类丢失更新 2.第二类丢失更新 3.脏读 4.不可重复读 5.幻读
数据库隔离级别:1. 读未提交 2. 读已提交 3. 可重复读 4. 串行化

事务四大性质

  1. 原子性
    原子性是指事务里面包括的所有操作,要么全部成功,要么全部失败。
  2. 一致性
    事务提交后,数据库会从一个状态转变成另一个一致性的状态。类似A给B转账,A减少100,则B增加100
  3. 隔离性
    事务与事务之间相互是需要一定程度的隔离。不然得到的数据将不可靠。
  4. 持久性
    数据库的数据后被保存到数据库所在的服务器的磁盘中。就算宕机了,重启后数据还是可以恢复的。

并发数据库下可能发生的问题

  1. 第一类丢失修改
    innoDB——数据库锁、隔离级别
    事务A提早开启事务,事务B在A的中途进行,并对同一个字段进行了读取、修改、提交。但是事务A进行了回滚,则事务B的修改就丢失了。
  2. 第二类丢失修改
    innoDB——数据库锁、隔离级别
    事务B先于事务A开始,事务A的读取动作比事务B慢一点,但是事务B的提交早于事务A。事务A后续提交后,会对事务B提交的结果进行覆盖。
  3. 脏读
    innoDB——数据库锁、隔离级别
    脏读存在于事务B进行了修改,但是还未提交的情况下,事务A对未提交的字段进行读取,但是事务B此时进行了回滚操作,事务A再进行提交操作。这时的数据就产生了错误。
  4. 不可重复度
    innoDB——数据库锁、隔离级别
    事务A会对同一个字段的值进行多次读取,事务B在中途进行提交,导致事务A第二次读取的值与第一次不一样。
  5. 幻读
    innoDB——数据库锁、隔离级别
    此处的幻读强调的是多次读得到的行数与前几次读到的行数不一样。

事务隔离级别

innoDB——数据库锁、隔离级别

Read Uncommitted (读未提交)

  • 读事务:允许其他事务的读写
  • 写事务:未提交的写事务禁止其他写事务,允许其他读事务
  • 解决:第一类丢失更新
  • 问题:脏读、不可重复读、幻读、第二类丢失更新(更新覆盖)

Read Committed (读已提交)

  • 读事务:允许其他事务的读写
  • 写事务:未提交的写事务禁止其他事务的读写
  • 解决:脏读、第一类丢失更新
  • 问题:不可重复度、幻读、第二类丢失更新

Repeatable Read(可重复读)

  • 读事务:允许其他事务的读、禁止其他事务的写
  • 写事务:未提交的写事务禁止其他事务的读写
  • 解决:脏读、第一类丢失更新、第二类丢失更新、不可重复读
  • 问题:幻读
  • 解决方案:MVCC(多版本并发控制),一个事务开始,会得到相应的版本号,在这个事务里面读同一个版本号的同一个数据,都是相同的,解决了不可重复读

Serializable(串行化)

每个事务串行执行,不存在并发的情况,效率极低。
解决:各种并发问题
问题:没有任何问题