ACID

  • Atomic 可以看成是过程的原子性
  • Consistency 可以看成是 结果的原子性

**

隔离级别

  1. 读未提交
    1. 事务A可以读事务B未提交的更新
  2. 读已提交(不可重复读)
    1. 事务A只能读到事务B已提交的更新
    2. 但是事务A在事务内读到的相同数据对应的值可能不一样(由于事务B的提交对该数据进行了更新)
  3. 可重复读
    1. 事务A在事务内读到的相同数据对应的值都是一样的,即使事务B的提交对其进行了更新
    2. 可重复读的现象针对更新操作
  4. 串行化
    1. 由于事务被串行(只有上一次事务 commit 了,下一个事务才能执行),事务间的修改、增删都不会影响了
    2. 解决幻读
      1. 幻读就是事务A的相同查询获得的查询集,由于事务B的插入/删除导致查询集大小不一致
      2. 幻读的现象针对插入/删除操作

**

MySQl 的隔离级别

  • 可重复读

    如何实现

  • innodb 存储引擎基于 MVCC (multi-version concurrency control) 机制

  1. MySQL 对每个事务都有自己的事务id,这个 id 自增,全局唯一
  2. innodb 存储引擎,会在每行数据的最后加两个隐藏列,一个保存行的创建时间(其实是新增操作的事务id),一个保存行的删除时间(其实是进行删除操作的事务id)
  3. 一个事务进行查询时,查询到的记录要求是前面的事务或者自己事务所创建的,所以要求对应记录的创建时间的事务id要 <= 当前事务id;并且查询到的记录要么是没被删除,要么是被当前事务开启后所删除,所以要求对应记录的删除时间的事务id为空或者 > 当前事务id
  4. 当一个事务对记录进行了修改,那么对应记录会生成一个副本(即在 innodb 存储引擎中新创建一行),原来记录的删除时间设置为新的事务的id,副本的创建时间设置为新的事务的id
    1. 读取原来记录的事务,就不会读取到副本的内容(因为副本的创建时间的事务id大于当前事务的id,并且删除时间的事务id比当前事务大)