1.sql server 下一共有6个事务隔离级别
-- Syntax for SQL Server and Azure SQL Database SET TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED //读未提交 | READ COMMITTED //读提交 | REPEATABLE READ //重复读 | SNAPSHOT //快照 | SERIALIZABLE //可序列化 | READ COMMITTED SNAPSHOT //读提交的快照 }
获取事务隔离级别(isolation level)
DBCC USEROPTIONS
可以看到数据库默认的transaction 级别为 read committed
设置隔离
设置回话隔离 SET TRANSACTION ISOLATION LEVEL <ISOLATION NAME> --注意:在设置回话隔离时(REPEATABLE READ)两个单词需要用空格间隔开,但是在表隔离中可以粘在一起(REPEATABLEREAD) 设置查询表隔离 SELECT ....FROM <TABLE> WITH (<ISOLATION NAME>)
2.1 read uncommitted 为最低隔离的等级.可以得到没有提交的数据 请看如下的例子
窗口1:
窗口2:
两个脚本窗口一先执行,窗口2后执行,我们可以看到窗口2 出现了脏读,读到了还没有提交的数据 "11".
2.2 read committed
下面引用csdn上的描述
指定语句不能读取已由其他事务修改但尚未提交的数据。 这样可以避免脏读。 其他事务可以在当前事务的各个语句之间更改数据,从而产生不可重复读取和虚拟数据。 该选项是 SQL Server 的默认设置。
实际例子如下:
窗口1:
窗口2:
我们可以看到窗口1的同一个事务中读取同一条数据前后会不一样,导致了 不可重复读取和虚拟数据
3. repeatable read(重复读)
指定语句不能读取已由其他事务修改但尚未提交的行,并且指定,其他任何事务都不能在当前事务完成之前修改由当前事务读取的数据。
只需将 read committed 例子的 isolation level 改为 repeatable read 在执行就可以看出差别.修改等级后,更新操作必须等到第一个事务提交后才可执行
4.serializeable(可串行的)
-
-
语句不能读取已由其他事务修改但尚未提交的数据。
-
任何其他事务都不能在当前事务完成之前修改由当前事务读取的数据。
-
在当前事务完成之前,其他事务不能使用当前事务中任何语句读取的键值插入新行。
-
隔离级别 | 脏读 | 不可重复读 | 虚拟读取 |
---|---|---|---|
未提交的读取 | 是 | 是 | 是 |
已提交的读取 | 否 | 是 | 是 |
可重复的读取 | 否 | 否 | 是 |
快照 | 否 | 否 | 否 |
可序列化 | 否 | 否 | 否 |