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にデータの整合性の問題が発生する可能性があるためです。そして、それは間違いなくOKではありません。

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

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

于 2011-12-25T17:41:00.237 に答える