Параллельность транзакций в C # - PullRequest
3 голосов
/ 25 декабря 2011

пользователь 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 последнее ожидание. Как мне это сделать.

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

1 Ответ

3 голосов
/ 25 декабря 2011

Чтение без наблюдения блокировок является приемлемым, поскольку в худшем случае вы вызываете проблемы с целостностью данных (фантонное / неповторяющееся чтение) для SPID, который запросил nolock - что нормально: оно было применено самостоятельно1002 *

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

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

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

...