Mysql事务及其隔离机制/隔离级别

mysql事务特性是什么?

原子性(atomicity):一个事务必须视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性。

一致性(consistency):数据库总是从一个一致性的状态转换到另一个一致性的状态。

隔离性(isolation):一个事务所做的修改在最终提交以前,对其他事务是不可见的。

持久性(durability):一旦事务提交,则其所做的修改就会永久保存到数据库中。此时即使系统崩溃,修改的数据也不会丢失。

实现:

持久性:通过 redo log来保证的
原子性:通过 undo log来保证的
隔离性:通过 MVCC 或锁机制来保证的
一致性:通过持久性+原子性+隔离性来保证

事务隔离级别

读未提交
所有事务可以看到其它事务没有提交的结果,会有很多
问题,如脏读、幻读、不可重复读等。
读提交
大多数数据库的默认隔离级别。满足了隔离的简单定义,一个事务只能看到其它事务提交事务做的改变,会引起不可重复读。一个事务执行时,多次select,会看到不同结果。
可重复读
MySQL默认的隔离级别,确保同一个事务,在执行中,多次读取操作数据,会看到同样的数据行。但是有的数据库会有幻读问题。幻读说的是"幻影"行,其它事务可能对表插入了新行。
串行化
事务的最高隔离级别,通过强制事务排序,使之不能相互冲突,解决了幻读的问题。在每个读的数据上加共享锁。可能会导致超时和锁竞争。

MVCC:数据库并发场景下的解决方案

MVCC是高并发版本控制器,用于数据库中对数据库的并发访问。Mysql中InnoDB用这种方法来提高读写事务的并发性能、原因是MVCC是一种不采用锁来控制事务的方式。同时还可以解决脏读,幻读,不可重复读等事务隔离问题,
不能解决更新丢失问题

MVCC实现原理依靠:记录中的3个隐含字段、undo log日志、Read View实现。

  1. 隐含字段:

  2. undo log日志:
    insert undo log:事务进行插入操作时产生、在事务回滚时需要,提交事务后可以被立即丢

update undo log:进行update、delete时产生的undo log、不仅在回滚事务时需要、在快照读时也需要。所以不能随便删除,只有在快速读或事务回滚不涉及该日志时,对应的日志才会被purge线程统一清除(purge类似jvm中的gc垃圾回收器)

  1. Read View(读视图): 一致性视图
    在快照读会产生Read View视图,事务执行快照读的那一刻,会生成数据库快照,并且记录。记录当前活跃的事务ID(因为每个事务启动开启的时候,都会被分配一个ID,这个ID是递增的,所以越新的事务,ID越大)。

简单说,读视图是记录快照读那一刻所有记录,下次快照时使用的还是同一个Read View所以其它事务修改。
而隔离级别中的RR(可重复读)、和RC(提交读)不同就是差在快照读时

前者创建一个快照和Read View,并且下次快照读时使用的还是同一个Read View所以其他事务修改数据对他是不可见的、解决了不可重复读问题。

后者则是每次快照读时都会产生新的快照和Read View、所以就会产生不可重复读问题。

简述MVCC实现原理:
InnoDB 每一行数据都有一个指向上一个版本数据在undo log日志里的位置指针。如果要执行更新操作,会将原记录放入 undo log 中,并通过隐藏的回滚指针指向 undo log 中的原记录。其它事务此时需要查询时,就是查询 undo log 中这行数据的最后一个历史版本。

优点:MVCC:读不加锁,读写不冲突。
通过

你可能感兴趣的:(mysql,数据库)