1、SQL Server 的 5个标准事务隔离级别分别是:READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ 和 SERIALIZABLE,SNAPSHOT . SQL Server 使用锁来实现隔离级别。
下面使用 GIF 动画对 SQL Server 前4 个隔离级别进行描述:
2、当多个事务同时进行时,通过设置隔离级别来处理脏读、不可重复读、幻读事件
read uncommitted | 0 未提交读将查询的隔离级别指定为 0。可以读脏数据读脏数据:一事务对数据进行了增删改,但未提交,有可能回滚,另一事务却读取了未提交的数据read committed | 1 已提交读(sqlserver 默认级别)将查询的隔离级别指定为 1。避免脏读,但可以出现不可重复读和幻读不可重复读:一事务对数据进行了更新或删除操作,另一事务两次查询的数据不一致幻像读:一事务对数据进行了新增操作,另一事务两次查询的数据不一致repeatable read | 2 可重复读将查询的事务隔离级别指定为 2。避免脏读,不可重复读,允许幻像读serializable | 3 可序列化将查询的隔离级别指定为 3。串行化读,事务只能一个一个执行,避免了脏读、不可重复读、幻读执行效率慢(我遇到过一种情况,用时是隔离级别1的30倍),使用时慎重SNAPSHOT当读取数据时,可以保证读操作读取的行是事务开始时可用的最后提交版本。这意味着这种隔离级别可以保证读取的是已经提交过的数据,并且可以实现可重复读,也能确保不会幻读。不过这种隔离级别使用的不是共享锁,而是行版本控制。SQL Server 2005以后的版本支持。
下表显示了不同隔离级别允许的并发副作用。
隔离级别
|
脏读
|
不可重复读
|
虚拟读取
|
---|---|---|---|
未提交读
|
是
|
是
|
是
|
已提交读
|
否
|
是
|
是
|
可重复读
|
否
|
否
|
是
|
快照
|
否
|
否
|
否
|
可序列化
|
否
|
否
|
否
|