2011-12-25 4 views
3

пользователь 1:Параллелизм транзакций в C#

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. Выполняется второй оператор user 2.

Но я хочу выполнить этого пользователя. 2 последнее утверждение не ждет. Как мне это сделать.

Пожалуйста, помогите мне.

ответ

3

Чтение без наблюдения за замками поддерживается, поскольку в худшем случае вы вызываете проблемы с целостностью данных (phanton/non-repeatable reads) на SPID, который запросил nolock - это нормально: это было самораскрыто.

Написание без наблюдения за замками нет, AFAIK, поддерживается. Поскольку это позволит вам вызывать проблемы с целостностью данных до других SPID. И это определенно не ОК.

Итак, в основном; насколько мне известно: вы не можете. Вам придется подождать, чтобы получить замок.

Лучший способ избежать задержек блокировок - обеспечить, чтобы транзакции выполняли минимальную работу, необходимую для обеспечения согласованного изменения (и без внешних операций в середине транзакции).

+0

Большое спасибо !!! –

Смежные вопросы