用户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的最后一条语句而不等待。我该怎么做。

请帮我。

最佳答案

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

AFAIK不支持不观察锁的写入。因为这将使您引起其他SPID的数据完整性问题。这绝对是不行的。

所以基本上据我所知:您不能。您将不得不等待获取锁。

避免锁延迟的最好方法是确保事务执行必要的最小工作以确保一致的更改(并且在事务中间无需外部操作)。

关于c# - C#中的交易并发,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8630662/

10-09 17:16