2011-12-25 58 views
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最後的聲明沒有等待。我該怎麼做。

請幫幫我。

回答

3

讀取未觀察鎖定是可支持的,因爲最糟糕的情況是您對請求nolock的SPID導致數據完整性問題(phanton /不可重複讀取) - 這很好:它是自我加載的。

不觀察鎖定寫入不支持AFAIK。由於這會導致數據完整性問題導致其他 SPID。那絕對是不是好的。

所以基本上;據我所知:你不能。你必須等待才能獲得鎖定。

避免鎖定延遲的最好方法是確保事務完成確保一致更改(並且在事務處理過程中沒有外部操作)所需的最少工作。

+0

非常感謝! – 2012-01-01 11:20:58