SQL Server有哪几种隔离级别?

事隔离级别用于控制并发用户如何控制并发用户读写的操作。读操作可以是任何检索数据的语句,默认使用共享锁。写操作是指任何对表进行修改的语句,需要使用排他锁。

可以设置的隔离级别有6个:READ UNCOMMITTED(未提交读),READ COMMITTED(可提交读),REPEATABLE READ(可重复读),SERIALIZABLE(可序列化),SNAPSHOT(快照),以及READ COMMITTED SNAPSHOT(已经提交隔离)。

 

获取事务隔离级别(isolation level)

DBCC USEROPTIONS

设置隔离级别

SET TRANSACTION ISOLATION LEVEL <ISOLATION NAME>

--注意:在设置回话隔离时(REPEATABLE READ)两个单词需要用空格间隔开,但是在表隔离中可以粘在一起(REPEATABLEREAD)

设置查询表隔离

SELECT ....FROM <TABLE> WITH (<ISOLATION NAME>)

隔离级别越高,一致性越高,并发性越低

 

READ UNCOMMITTED(未提交读)

未提交读是最低的隔离级别,在这个级别运行的事务,读操作不会请求共享锁。如果读操作不请求共享锁,就绝对不会和排他锁的写操作发生冲突。这意味这读操作也能读取未提交的修改(也称为脏读)。

 

READ COMMITTED(已提交读)

如果想避免读取未提交的修改,则需要使用要求更高的隔离级别。能够防止脏读的最低级别是READ COMMITTED,这也是SQL Server默认使用的隔离级别。这个隔离解绑只允许读取已经提价过的修改。它要求读操作必须获得共享锁才能进行,从而防止读取未提交的修改。

在该级别中,读操作一旦完成,就立即释放共享锁。他不会在事务持续期间保留它;这意味着在一个事务中间对相同数据资源的两次访问,没有共享锁会锁定该资源。因此,其他事务可以在两个读操作之间修改资源,读操作也有可能每次取到不同的值。这种现象称为不可重复读(non-repeatable read)或不一致分析(inconsistent analysis)。

 

REPEATABLE READ(可重复读)

如果想保证在事务内进行的两个读操作之间,其他任何事务都不能修改有当前事务读取的数据,则需要把隔离级别设置为REPEATABLE READ。在这种隔离级别下,事务中的读操作不但需要获得共享锁才能读取操作,而且获得的共享锁将一直保持到事务结束。

REPEATABLE READ隔离级别能够防止的另一种并发负面影响是丢失更新(lost update),而较低的隔离级别不能防止此问题。丢失更新是指两个事务同时读取了同一个值,然后基于最初读取的值进行计算,接着再更新该值,这样最后提交的事务是“赢家”。覆盖其他事务所做的更新,这将导致事务丢失。

 

在REPEATABLE READ隔离级别下运行的事务,读操作会一直持有共享锁直到事务结束。但是事务只锁定第一个运行时找到的哪些数据资源,而不会锁定查询结果范围以外的其他行。因此,在同一事务进行第二次读取之前,如果其他事务插入了新行,而且新行也能满足读操作的查询过滤条件,那么这些新行也会出现第二次读取操作返回的结果中。这些新行称为幻影(phantom),这种读操作称为幻读(phantom read)。

 

SERIALIZABLE (可序列化)

为了避免幻读,需要将隔离级别设置为SERIALIZABLE级别 ,它和REPEATABLE READ类似:即读操作需要获得共享锁才能读取数据,并保留共享锁直到事务结束。不过SERIALIZABLE隔离级别增加一个新内容-------逻辑上,这个隔离级别会让读操作锁定满足搜索条件的键整个范围。这就意味着读操作不仅锁定了满足条件的那些行,还锁定了未来可能满足搜索条件的行。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值