Sql Server 2000中的共享锁的问题(40分)

  • 主题发起人 主题发起人 mycwcgr
  • 开始时间 开始时间
M

mycwcgr

Unregistered / Unconfirmed
GUEST, unregistred user!
Sql Server 2000中的共享锁的问题

电子工业出版《SQL Server 2000基础与提高》
P483: 共享锁定(S):保证资源可读。当事务对资源采用共享锁定时,不影响
其它事务对资源的读取,但其它事务不能修改资源。......
P487: HOLDLOCK:保持共享锁,直至事务完成。通常共享锁定在锁定对象不再需 要时立即释放,等效于SERIALIZABLE事务隔离级,当用SELECT语句查询多
个行时,通常获得页级锁定、共享锁定。但共享锁定不禁止其它事务更新
数据行。另外,随着读取下一页,数据页的共享锁定就会失效。...

我非常奇怪:一个说在共享锁定时,其它事务不能修改资源,而另外一个说
不禁止其它事务更新数据行。
 
锁定以后,数据只读,不能更改。,
 
说得不对, 应是共享锁不影响其它连接读取数据, 但在任何一个资源上如有一个连接
保持了共享锁的话, 在其未释放前, 其它连接是不能修改此资源的.所能其P483所云是正
确的, 你如不信可自己开两个连接, 一试便有分明.
 
两种说法应该都对,个人认为对于共享锁当数据被读取之后,Sql server会立即释放共享锁,所以当用SELECT
语句查询多个行时,随着读取下一页,数据页的共享锁定就会失效,当然不禁止其它事务更新
数据行(除非将事务隔离级别设为可重复读或更高级别),另外更新锁和共享锁是兼容的,如当2个
事务以共享锁锁定某资源后,允许其中一个事务升级为更新锁,再转化为排它锁,哈哈可以更新数据了.
(所谓共享锁不允许其它事务修改资源,指的是不允许其它事务直接申请排它锁罢了).
 
第二种说法不对的是 "共享锁定不禁止其它事务更新数据行" 这句至于其它是对的,
如果一个资源保持了共享锁, 其它人绝对不能修改, 除非用事务绑定.HOLDLOCK就是保
持共享锁,相当于设了事务隔离级别,其它事务更新数据只能等到保持共享锁的事务释放
后方可修改数据.
 
接受答案了.
 
后退
顶部