3

用户 1:

begin tran
select * from items with(nolock);
insert into orders (odate) values(getdate());

insert into OrderData values((select max(orderid) from Orders with(nolock)),1,1);
update Items set qih=qih-1 where item_id=1;
select * from OrderData where oid=(select max(orderid) from Orders with(nolock));

insert into OrderData values((select max(orderid) from Orders with(nolock)),2,1);
update Items set qih=qih-1 where item_id=2;
select * from OrderData where oid=(select max(orderid) from Orders with(nolock));

commit tran;

用户 2:

begin tran
select * from items with(nolock);
insert into orders (odate) values(getdate());

insert into OrderData values((select max(orderid) from Orders with(nolock)),1,1);//in here waiting this user

提交 user1 后。用户 2 的最后一条语句正在执行。

但我想执行这个用户 2 的最后一条语句而不是等待。我该怎么做。

请帮我。

4

1 回答 1

3

不观察锁的读取是可以支持的,因为最坏的情况是您对请求的 SPID 造成数据完整性问题(幻顿/不可重复读取)nolock- 这很好:它是自己造成的。

AFAIK 不支持在不观察锁的情况下进行写入。因为这将允许您对其他SPID 造成数据完整性问题。这绝对是不行的。

所以基本上; 据我所知:你不能。您必须等待才能获得锁。

避免锁延迟的最好方法是确保事务做最少的工作以确保一致的更改(并且在事务中间没有外部操作)。

于 2011-12-25T17:41:00.237 回答