事务隔离(3)

风格不统一 提交于 2020-03-30 11:23:53

事务

保证一组数据库操作,要么全部成功,要么全部失败。

ACID特性

  • 原子性:Atomicity
  • 一致性:Consistency
  • 隔离性:Isolation
  • 持久性:Durability

当数据库中有多个事务同时执行的时候,就可能出现脏读(dirty read)、不可重复读(non-repeatable read)、幻读(phantom read)的问题,为了解决这些问题,就有了“隔离级别”的概念。隔离的越严实,效率就会越低,需要在两者之间找一个平衡点。

事务隔离级别
隔离级别:串行化 > 可重复读 > 读提交 > 读未提交

  • 读未提交:read uncommitted,一个事务还没提交时,它做的变更就能被别的事务看到。会导致“脏读”、“幻读”、“不可重复读”。
  • 读提交:read committed,一个事务提交之后,它做的变更才会被其他事务-看到。避免了“脏读”,但不能避免“幻读”和“不可重复读”。
  • 可重复读:repeatable read,一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据时一致的。当然在可重复读的隔离级别下,未提交变更对其他事务也是不可见的,MySQL的默认级别。 避免了“脏读”和“不可重复读”,但不能避免“幻读”。
  • 串行化:serializable,对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。能比秒“脏读”、“幻读”、“可重复读”。

不同事务级别带来的并发问题

  • 脏读:读取到了别的事务回滚前的脏数据。事务A读取了被另一个事务B修改,但是还未提交的数据。假如事务B回退,则事务A读取的是无效数据。
  • 不可重复读:当前事务进行了一次数据读取,然后再次读取的数据是别的事务修改成功的数据,导致两次读取到的数据不匹配
  • 幻读:当两个完全相同的查询执行时,第二次查询所返回的结果集和第一个查询的不相同。

MVVC概念
Multi-Version Concurrency Cotrol,多版本并发控制,直白的意思是同一份数据临时保留多个版本,进而实现并发控制。
MySQL中建表时,每个表都会有三列隐私字段,其中和MVCC有关系的有两列:

  • 数据行的版本号(DB_TRX_ID
  • 删除版本号(DB_ROLL_PT
    每开始一个新的事务,系统版本号都会自动递增。事务开始时刻的系统版本号会作为事务的版本号,用来和查询到的每行记录的版本号进行比较。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!