何时/什么锁在READ COMMITTED隔离级别保持/释放

我想了解SQL Server中的隔离/锁定。

我在READ COMMITTED隔离级别(默认)

我们有一张桌子。

create table Transactions(Tid int,amt int)

with some records

insert into Transactions values(1, 100)
insert into Transactions values(2, -50)
insert into Transactions values(3, 100)
insert into Transactions values(4, -100)
insert into Transactions values(5, 200)

现在从MSDN我明白了

当一个select被触发时, 共享锁被取消,所以没有其他事务可以修改数据(避免脏读)。文档还谈到行级别,页面级别,表级别锁定。 我想到了以下情节

Begin Transaction

select * from Transactions

/*
some buisness logic which takes 5 minutes

*/

Commit

我想了解的是共享锁将在多长时间内获取以及哪个(行,页,表)。

只有在select * from Transactions运行时,锁定才会被获取,或者在我们达到COMMIT之前,它将获取整个5分钟以上的时间。


只有在select * from Transaction时才会获取锁定

你可以用下面的代码来检查它

打开一个sql会话并运行这个查询

Begin Transaction

select * from Transactions

 WAITFOR DELAY '00:05'
/*
some buisness logic which takes 5 minutes

*/

Commit

打开另一个SQL会话并运行下面的查询

Begin Transaction
Update Transactions
Set = ...
where ....
commit

你问的是错误的问题,你担心的是实施细节。 你应该考虑并关心的是隔离级别的语义。 肯德拉小有一个很好的海报解释他们:免费海报! SQL Server隔离级别指南。

你的问题应该改写为:

从项目中选择*

问:我会看到什么物品?
答:所有承诺的项目

问:如果有未插入/删除/更新项目的未提交事务会发生什么情况?
答:您的SELECT将阻塞,直到所有未提交的项目被提交(或回滚)。

问:如果在运行上面的查询时插入/删除/更新新项目,会发生什么情况?
答:结果未确定。 您可能会看到一些修改,不会看到其他一些修改,并且可能会阻止其中一些修改。

一旦你的陈述完成,READ COMMITTED就没有承诺,与交易的长度无关。 如果再次运行该语句,则会再次具有与之前的状态完全相同的语义,并且之前看到的项目可能会更改,消失并可能出现新项目。 显然这意味着您可以在选择之后对项目进行更改。

更高的隔离级别提供了更强的保证:REPEATABLE READ保证在您提交之前,您第一次选择的任何项目都可以被修改或删除。 SERIALIZABLE增加了保证在您提交之前没有新的项目可以出现在您的第二个选择中。

这是你需要理解的,而不是实现机制的工作原理。 在掌握了这些概念之后,您可能会询问实施细节。 它们都是在“事务处理:概念和技术”中描述的。


你的问题是一个很好的问题。 了解获取何种类型的锁可以深入理解DBMS。 在SQL Server中,在所有隔离级别(读取未提交,读取提交(默认),可重复读取,可序列化)下,执行写入操作的独占锁定。

无论隔离级别如何,在事务结束时都会释放专用锁。

隔离级别之间的差异是指共享(读)锁获取/释放的方式。

在读取未提交隔离级别下,不会获取共享锁。 在此隔离级别下,会发生称为“Dirty Reads”的并发问题(允许事务从已由另一个正在运行的事务修改的行读取数据,但尚未提交,因此可能会回滚)。

在“读取提交隔离级别”下,共享锁是针对相关记录获取的。 当前指令结束时,共享锁将被释放。 这个隔离级别可以防止“脏读”,但由于记录可以被其他并发事务更新,因此“非重复读”(事务A检索行,事务B随后更新行,事务A稍后再次检索同一行。事务A检索同一行两次,但看到不同的数据)或“幻像读取”(在事务过程中,执行两个相同的查询,第二个查询返回的行集合与第一个查询不同)可能发生。

在可重复读取隔离级别下,共享锁是在事务持续时间内获取的。 可以防止“脏读”和“不可重复读”,但仍然可以发生“幻像读”。

在可序列化隔离级别下,范围内的共享锁是在事务处理期间获取的。 没有发生上述并发问题,但性能大幅降低,存在发生死锁的风险。

链接地址: http://www.djcxy.com/p/32877.html

上一篇: when/what locks are hold/released in READ COMMITTED isolation level

下一篇: insert exclusive locking