MVCC和事务的隔离级别

1、事务:一个数据库事务通常包含对数据库进行读或写的一个操作序列。

2、事务的四大属性(ACID

  (1)原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。

  (2)一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。

  (3)隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。

  (4)持久性(Durability):一个事务一旦提交,他对数据库的修改应该永久保存在数据库中。

3、数据库4种隔离级别

  (1)读未提交(READ UNCOMMITTED) :一个事务还未提交时,它所作的变更就能被别的事务看到。

  (2)读提交(READ COMMITTED) :一个事务提交后,它所作的变更才能被别的事务看到。

  (3)可重复读(REPEATABLE READ) :一个事务执行过程中看到的数据,和这个事务在启动时候看到的数据是一致的。在可重复读级别,未提交的变更其他事务也不可见。

  (4)串⾏化(SERIALIZABLE) :对同一行记录,读会加读锁,写会加写锁。当出现读写锁冲突的时候,后访问的事务会等待前面的事务执行完后才可继续执行。

4、事务的隔离级别解决的问题

  (1)脏读:一个事务读到了另一个事务未提交修改过后的数据。

  (2)不可重复读:⼀个事务只能读到另⼀个已经提交的事务修改过的数据,并且其他事务每对该数据进⾏⼀次修改并提交后,该事务都能查询得到最新值。

  (3)幻读:⼀个事务先根据某些条件查询出⼀些记录,之后另⼀个事务⼜向表中插⼊了符合这些条件的记录,原先的事务再次按照该条件查询时,能把另⼀个事务插⼊的记录也读出来。

5、事务隔离级别和MVCC的关系

  (1)在读提交 隔离级别下,这个视图是在每个SQL语句开始执⾏的时候创建的,在这个隔离级别下,事务在每次查询开始时都会⽣成⼀个独⽴的ReadView

  (2)可重复读,在第⼀次读取数据时⽣成⼀个ReadView,对于使⽤ REPEATABLE READ 隔离级别的事务来说,只会在第⼀次执⾏查询语句时⽣成⼀个 ReadView ,之后的查询就不会重复⽣成了,所以⼀个事务的查询结果每次都是⼀样的。

  (3)串⾏化 隔离级别下直接⽤加锁的⽅式来避免并⾏访问。

  (4)序列化 被称为数据库隔离级别的 ⻩⾦标准 ,它是绝⼤多数商业数据库系统中提供的最⾼隔离级别,⼀些⾼度⼴泛部署的系统甚⾄⽆法提供隔离级别与可序列化⼀样⾼,⾦融的场景居多,性能也是最差的。

原文地址:https://www.cnblogs.com/yhcTACK/p/15685498.html