2014-01-25 56 views
0

作为每read committed isolation level on wiki读取已提交隔离级别下的更新?

读致力于

在该隔离电平,基于锁的并发控制DBMS执行保持写锁(在选定数据中获取),直到事务结束, 但读锁被只要SELECT操作被执行

按照上面的语句,它看起来像,每当任何更新语句是exceute是否释放其对整个表(codesnippet 1)或选定的范围(codesnippet 2), READ C ommitted隔离级别将保持锁定,直到提交

codesnippet 1 
begin tran 
update Employee set category = "permanent" 
... 
end tran // lock will be released here 

codesnippet 2 
begin tran 
update Employee set category = "permanent" where id =1 
... 
end tran // lock will be released here 

第2节: -

但是按照同一链路上Isolation Levels vs Lock Duration部分看起来像在update on selected range情况下,将导致锁被relaesed一次更新被执行。它不会 等到交易ened

begin tran 
update Employee set category = "permanent" where id =1 
// lock will be released here 
........ 
end tran 

我的问题是部分正确2或第1?

+1

您正在使用哪些DBMS?锁定行为(特别是对于并发读取和写入)与DBMS高度相关 –

+0

@ a_horse_with_no_name sql server –

回答

0

两者,他们不是在谈论同一把锁。

写入操作是指单个行及其锁定。范围操作是指行的集合及其锁(通常是整个表上的锁)。

也就是说,声明

update Employee set category = "permanent" where id =1 

将收购的声明的期限表锁,并锁定更新的行(个),交易的持续时间。

+0

正如您所说:“写入操作引用单个行及其锁。”您是什么意思?要更新单个行,您需要where子句。因此,“更新Employee set category =”permanent“where id = 1”可以是individuaql行或行集合。对? –

+0

写入操作与更新语句不同。要执行更新语句,数据库必须首先查找与where子句(维基百科表中的“范围操作”)匹配的行,计算这些行的新值并写入它们(从维基百科的“写入操作”表)。 – meriton

相关问题