Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Вложенная транзакция и уровень её изоляции
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2001, 11:28 |
|
||
|
Вложенная транзакция и уровень её изоляции
|
|||
|---|---|---|---|
|
#18+
То что Вы написали работает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2001, 02:17 |
|
||
|
Вложенная транзакция и уровень её изоляции
|
|||
|---|---|---|---|
|
#18+
Да, работает. Вот конкретный пример такой процедуры. 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2001, 11:28 |
|
||
|
Вложенная транзакция и уровень её изоляции
|
|||
|---|---|---|---|
|
#18+
Во первых: Rollback всегда отменяет транзакцию самого верхнего уровня, если не использовано SAVE TRANSACTION. Во вторых: можно использовать в селекте хинт HOLDLOCK, что обеспечит ту же блокировку, что и set transaction isolation level serializable, только на уровне конкретной таблицы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2001, 11:37 |
|
||
|
|

start [/forum/topic.php?fid=46&tid=1825313]: |
0ms |
get settings: |
6ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
33ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
17ms |
get tp. blocked users: |
1ms |
| others: | 215ms |
| total: | 295ms |

| 0 / 0 |
