Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Блокировка до конца вложенной транзакции  [new]
PZH
Member

Откуда:
Сообщений: 57
begin tran;
begin tran;
select * from someTable (holdlock tablockx);
--здесь someTable должна быть намертво заблокирована
--<some code 1>
commit tran;
--а тут someTable должна быть свободна
--<some code 2>
commit tran;


Как это реализовать?
holdlock устанавливает блокировку до конца корневой транзакции, а нужно только до конца вложенной.
5 май 12, 13:21    [12513237]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка до конца вложенной транзакции  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Нету в MSSQL вложенных транзакций.
5 май 12, 13:25    [12513272]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка до конца вложенной транзакции  [new]
Вложенные транзакции
Guest
PZH
begin tran;
begin tran;
select * from someTable (holdlock tablockx);
--здесь someTable должна быть намертво заблокирована
--<some code 1>
commit tran;
--а тут someTable должна быть свободна
--<some code 2>
commit tran;


Как это реализовать?
holdlock устанавливает блокировку до конца корневой транзакции, а нужно только до конца вложенной.

1. Вложенные транзакции в MS SQL, по большому счету, фикция.
2. для чего вам нужно блокировать таблицу только во вложенной транзакции? Её коммит не означает зафиксированности данных, если откатиться внешняя транзакции - изменения внесенные во внутренней транзакции тоже откатятся.
5 май 12, 13:25    [12513275]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка до конца вложенной транзакции  [new]
PZH
Member

Откуда:
Сообщений: 57
Вложенные транзакции,

автор
для чего вам нужно блокировать таблицу только во вложенной транзакции? Её коммит не означает зафиксированности данных, если откатиться внешняя транзакции - изменения внесенные во внутренней транзакции тоже откатятся.


просто <some code 2> может затянуться, а длительная блокировка someTable критична для системы. А то что данные из <some code 1> не сохранятся в случае ролбэка - не важно, т.к. они важны только на время выполнения <some code 2>..
Тогда еще вопрос как обеспечить блокировку 2-х таблиц на время удаления из них записей без holdlock-а?
Вот утрированный пример с holdlock'ом:

begin tran;
select * from someTable1 (holdlock tablockx);
select * from someTable2 (holdlock tablockx);
delete from someTable1 where id = @id;
delete from someTable2 where id = @id;
commit tran;


Если так, то см. комментарий:
delete from someTable1 where id = @id;
--гипотетически тут может произойти чтение или изменение в someTable1 и someTable2
delete from someTable2 where id = @id;
5 май 12, 13:39    [12513381]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка до конца вложенной транзакции  [new]
iljy
Member

Откуда:
Сообщений: 8711
PZH,

а нафига вы при удалении одной записи блокируете всю таблицу? У вас возникают проблемы с согласованностью данных? На каком уровне изоляции?
5 май 12, 14:20    [12513670]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка до конца вложенной транзакции  [new]
PZH
Member

Откуда:
Сообщений: 57
iljy
а нафига вы при удалении одной записи блокируете всю таблицу? У вас возникают проблемы с согласованностью данных? На каком уровне изоляции?


Разумеется Serializable, недопустимо никакой параллельности.
5 май 12, 15:38    [12514265]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка до конца вложенной транзакции  [new]
iljy
Member

Откуда:
Сообщений: 8711
PZH
iljy
а нафига вы при удалении одной записи блокируете всю таблицу? У вас возникают проблемы с согласованностью данных? На каком уровне изоляции?


Разумеется Serializable, недопустимо никакой параллельности.

Это бизнес-задача так звучит? Или это ваш метод решения? Объясните, чем не устраивает просто установить уровень в SERIALIZABLE (либо SNAPSHOT/RCSI).
5 май 12, 17:03    [12514798]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить