powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вложенная транзакция и уровень её изоляции
4 сообщений из 4, страница 1 из 1
Вложенная транзакция и уровень её изоляции
    #32015273
Hi, All!

Я пишу хранимую процедуру MS SQL Server 2000, содержащую много операторов SQL.
Мне нужно, чтобы часть операторов процедуры выполнялась во вложенной транзакции
с уровнем изоляции SERIALIZABLE, чтобы обеспечить атомарность выполняемой ими операции.
Как правильно это реализовать?

Проблема в том, что я не хочу накладывать ограничения на работу клиентов с этой процедурой.
Процедура не знает кто её вызвал, в какой транзакции и с каким уровнем изоляции.
Я хочу не меняя уровня изоляции текущей транзакции организовать вложенную транзакцию с уровнем
изоляции SERIALIZABLE.

Вот структура процедуры, которую я реализовал сейчас (для краткости сами операторы SQL опущены):

create procedure dbo.NewClass
@vcName TGenericName, @vcNameParent TGenericName = NULL,
@vcParentNS TGenericName = NULL, @vcNameSpace TGenericName = NULL,
@lID TLongID OUTPUT
as
begin

оператор 1
оператор 2
...
оператор K

begin transaction TrNewClass
set transaction isolation level serializable

оператор K+1
оператор K+2
...
оператор K+M

commit transaction TrNewClass
goto L_OK
L_ERRH:
rollback transaction TrNewClass
return

L_OK:

оператор K+M+1
оператор K+M+2
...
оператор K+M+N

end
GO
...
Рейтинг: 0 / 0
Вложенная транзакция и уровень её изоляции
    #32015303
Slava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
То что Вы написали работает?
...
Рейтинг: 0 / 0
Вложенная транзакция и уровень её изоляции
    #32015340
Alexf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, работает. Вот конкретный пример такой процедуры.

CREATE PROCEDURE dbo.GenPK
@iTable int, @@lPK TLongID OUTPUT
as
begin
declare @iTranc int
begin transaction
set transaction isolation level serializable
set @iTranc = @@TRANCOUNT

set @@lPK = (select NextVal from dbo.mysys_Indexes a where a.ID=@iTable)
update dbo.mysys_Indexes set NextVal = @@lPK + 1 where dbo.mysys_Indexes.ID=@iTable
if( @@ROWCOUNT <> 1 OR (@@lPK is NULL) )
begin
raiserror 13001 'Ошибка генерации суррогатного ключа'
GOTO L_ERRH;
end
else if( @@ERROR <> 0 ) GOTO L_ERRH;

L_END:
if(@iTranc = @@TRANCOUNT) commit transaction
return

L_ERRH:
if(@iTranc = @@TRANCOUNT) rollback transaction
end
GO
...
Рейтинг: 0 / 0
Вложенная транзакция и уровень её изоляции
    #32015342
George
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Во первых: Rollback всегда отменяет транзакцию самого верхнего уровня, если не использовано SAVE TRANSACTION.
Во вторых: можно использовать в селекте хинт HOLDLOCK, что обеспечит ту же блокировку, что и set transaction isolation level serializable, только на уровне конкретной таблицы
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вложенная транзакция и уровень её изоляции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]