首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >读取提交隔离级别如何防止脏读取

读取提交隔离级别如何防止脏读取
EN

Stack Overflow用户
提问于 2012-03-15 12:28:36
回答 2查看 3.4K关注 0票数 0

我首先问一个简单的问题:

根据维基百科Msdn中的脏读定义:

我们有两个并发事务,T1和T2

当T1正在更新一行,而T2正在读取T1“尚未提交”的行时,就会发生脏读。

但在Read提交级别,共享锁在读取数据后立即释放(而不是在事务结束时甚至在语句结束时)。

那么Read提交如何防止脏读呢?Bkaz一旦发布在更新行上的共享锁,T2就可以读取更新的行,而t1可以回滚整个操作,那么我们就可以在t1上进行脏读取了。

EN

回答 2

Stack Overflow用户

发布于 2012-03-15 12:33:04

它阻止脏读取,因为T1在行上有一个锁,因此T2无法读取“尚未提交”行,该行稍后可能会被回滚。

提交的问题试图解决的问题是:

T1创建一个事务并编写一些东西

T2读到

T1回滚事务

现在,T2有一个从未真正存在过的数据。

根据DB的结构方式,有两种“好的”可能性:

T1创建一个事务并编写一些东西

T2等待T1结束事务

T2读取DB在T1开始事务之前的“快照”(它称为使用行版本控制提交读取)

( MSSQL的默认选项是第一个选项)

例如,这里比较了各种隔离级别:http://msdn.microsoft.com/en-us/library/ms345124(SQL.90).aspx (在Server 2005中提供的隔离级别下读取)

票数 1
EN

Stack Overflow用户

发布于 2012-03-15 12:38:50

当Server在读提交的隔离级别上执行语句时,它将逐行获取短暂的共享锁。这些共享锁的持续时间仅够长,足以读取和处理每一行;服务器通常在进入下一行之前释放每个锁。因此,如果在read下运行一个简单的select语句并检查锁(例如,使用sys.dm_tran_locks),通常一次最多只看到一个行锁。这些锁的唯一目的是确保语句只读取和返回提交的数据。锁起作用是因为更新总是获得一个排他锁,该锁阻止任何试图获取共享锁的阅读器。

这里上撕下来

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9719688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档