数据库事务隔离级别

事务及其四大特性:

事务(Transaction):

  访问并可能更新数据库中各种数据项的一个程序执行单元(unit),

  它通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起。

  当在数据库中更改数据成功时,在事务中更改的数据便会提交,不再改变。否则,事务就取消或者回滚,更改无效。

四大特性:

数据库的事务隔离级别有四种: 读未提交、读已提交、可重复读、序列化

不同的隔离级别下会产生脏读、幻读、不可重复读等相关问题,因此在选择隔离级别的时候要根据应用场景来决定,使用合适的隔离级别。


​ 各种隔离级别和数据库异常情况对应情况如下:

  |          隔离级别          |          脏读         |      不可重复读        |      幻读      |

  |    READ-UNCOMMITTED      |           √          |           √           |       √       |

  |      READ-COMMITTED      |           ×          |           √           |       √       |

  |     REPEATABLE-READ      |           ×          |           ×           |       √       |

  |       SERIALIZABLE       |           ×          |           ×           |       ×       |      
 MySQL数据库为我们提供的四种隔离级别:

  1. Read uncommitted (读未提交):最低级别,任何情况都无法保证。

事务的修改,即使没有提交,对其他事务也都是可见的。事务能够读取未提交的数据,这种情况称为脏读

                   

  2. Read committed (读已提交):可避免脏读的发生。                  

事务读取已提交的数据,大多数数据库的默认隔离级别。当一个事务在执行过程中,数据被另外一个事务修改,
造成本次事务前后读取的信息不一样,这种情况称为不可重复读

  3.Repeatable read (可重复读):可避免脏读、不可重复读的发生。                  

这个级别是MySQL的默认隔离级别,它解决了脏读的问题,同时也保证了同一个事务多次读取同样的
记录是一致的,但这个级别还是会出现幻读的情况。幻读是指当一个事务A读取某一个范围的数据时,
另一个事务B在这个范围插入行,A事务再次读取这个范围的数据时,会产生幻读

  4. Serializable (串行化):可避免脏读、不可重复读、幻读的发生。              

 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能
  产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读

事务隔离机制的实现基于锁机制和并发调度。其中并发调度使用的是MVVC(多版本并发控制),通过保存修改的旧版本信息来支持

并发一致性读和回滚等特性。

因为隔离级别越低,事务请求的锁越少,所以大部分数据库系统的隔离级别都是READ-COMMITTED(读取提交内容),

但InnoDB 存储引擎默认使用 **REPEATABLE-READ(可重读)**并不会有任何性能损失。

在Oracle数据库中,只支持Serializable (串行化)级别和Read committed (读已提交)这两种级别,其中默认的为Read committed级别。

原文地址:https://www.cnblogs.com/lifan12589/p/14785138.html