2011-12-25 28 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に対してデータの完全性の問題(ファントム/非反復読み取り)が発生する可能性があるため、ロックを監視せずに読み取りが可能です。

ロックを監視せずに書き込むことは、AFAIKには対応していません。これにより、データの整合性の問題を SPIDsにすることができます。そして、それは確かにではなく、 OKです。

だから基本的には;私の知る限りでは、あなたはできません。あなたはロックを取得するために待つ必要があります。

ロックの遅延を避ける最善の方法は、トランザクションが一貫性のある変更(トランザクションの途中での外部操作なし)を保証するために必要な最小限の作業を確実に実行することです。

+0

ありがとうございました! –