sql事务的隔离级别详细讲解

时间:2018-10-10
本文章向大家介绍SQL语言中事务的4个隔离级别,需要的朋友可以参考一下

事务的隔离级别其实是SQL语言的标准,这里我就以自己比较常用的MySQL数据库为例进行介绍。

关于关系型数据库和非关系型数据库的对比,我之前写过一篇文章简单地作了一些介绍,隔离级别是ACID原则中的第三点 Isolation隔离性的重要内容。

有兴趣的读者可以出门左转,查看我之前的随笔。

好了,先上一下MySQL数据库中修改隔离级别的命令:

SET [SESSION | GLOBAL]  TRANSACTION  ISOLATION  LEVEL

 {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}

 关于以上命令,有一些需要理解的点:

1)级别顺序 read uncommittd < read committed < repeatable read < serializable

我的理解是每一个级别都是在上一级别的基础上增加了表操作的限制。读者往下看就可以体会到这种限制的加强。

2)默认行为(不带session和global)是为下一个(未开始)事务设置隔离级别。如果使用GLOBAL关键字,此命令语句在全局中对从那点开始创建的所有新连接(除了不存在的连接)设置事务级别。注意需要SUPER权限做这个改变。使用SESSION 关键字为当前连接上执行的事务设置默认事务级别。另外, 任何客户端都能自由改变会话隔离级别(甚至在事务的中间),或者为下一个事务设置隔离级别。

具体操作读者可以同时打开多个终端,创建多个MySQL连接。在MySQL交互模式下直接输入以上的命令就可以体会一下以上不同级别的读写区别了。

下面是对四个隔离级别的介绍

1. Read Uncommitted 可以读取未提交的事务

在一个事务中执行查询操作,另外一个事务实例中执行更新或者插入操作,这些操作的数据是没有提交到磁盘或者数据库客户端的,那么第一个事务查询操作读取的数据可能是不真实的。即出现了所谓的脏读。

2. Read Committed   读取提交事务

      在read uncommitted的基础上限制对未提交事务的查询操作的限制。也支持所谓的(Nonrepeatable Read)不可重复读。

不可重复读,其实实际理解上是不要求重复读,即一个事务(这里的事务指的是一个用户对数据库的操作,在退出对数据库操作前都为同一个事务)前后两次的读取内容可以是不同的,即允许在本事务查询的过程中其他事务对本事务查询的数据进行更新/增加其他行(相对于一定范围而言),这样就会出现两次读取的不一致性。

3. Repeatable Read   可重复读

       在Read Committed的基础上限制本事务在执行查询操作的时候其他事务对本查询范围内的数据的修改操作,但允许插入新的数据。所以在本事务的前后两次范围(这里特指范围查询,因为非范围查询不会出现后面所述现象)查询中会出现幻读现象,即两次读取的数据量不同。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。关于这个强大的机制也许在之后的学习当中,会写写自己的一些学习心得。

4. Serilizable 串行化

       数据库最高级别的隔离限制,即一个事务在执行查询操作的时候,不允许其他事务对本事务查询范围内的数据有任何操作,这里会引入一个共享锁的概念,即本事务的查询操作别读取的数据锁住了,必须等本事务完成之后才允许其他事务获取这个共享锁进行其他操作。

好了,理论介绍到这里,具体的区别还需要动手操作一下去体会的,而至于在实战中怎么使用,还是要看具体的数据量和业务逻辑来进行选择。