[MSSQL]Встроенные процедуры+транзакции
От: Sshur Россия http://shurygin-sergey.livejournal.com
Дата: 11.02.10 09:06
Оценка:
Привет, all!


Что-то я не понял с использованием транзакций внутри встроенных процедур

create procedure test_proc
as
begin tran 

ROLLBACK transaction 
return 


go 

begin tran aa

exec test_proc

rollback tran aa


Имеем

Msg 266, Level 16, State 2, Procedure test_proc, Line 0
Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing. Previous count = 1, current count = 0.
Msg 3903, Level 16, State 1, Line 5
The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION.



Почему такое происходит?

MSDN:

В хранимых процедурах инструкция ROLLBACK TRANSACTION без аргументов savepoint_name или transaction_name откатывает все инструкции к самой внешней инструкции BEGIN TRANSACTION. Вызов инструкции ROLLBACK TRANSACTION в хранимой процедуре является причиной того, что значение @@TRANCOUNT после завершения хранимой процедуры отличается от значения @@TRANCOUNT при выдаче хранимой процедурой информационного сообщения. Это сообщение не влияет на последующую обработку.


Из выделенного непонятно, должна ли откатываться самая внешняя транзакция А если должна, то как сделать чтобы не она не откатывалась? transaction name дать тоже не получается.
Шурыгин Сергей

"Не следует преумножать сущности сверх необходимости" (с) Оккам
Re: [MSSQL]Встроенные процедуры+транзакции
От: Caracrist https://1pwd.org/
Дата: 11.02.10 09:16
Оценка:
Здравствуйте, Sshur, Вы писали:

S>Привет, all!



S>Что-то я не понял с использованием транзакций внутри встроенных процедур


S>
S>create procedure test_proc
S>as
S>begin tran 

S>ROLLBACK transaction 
S>return 


S>go 

S>begin tran aa

S>exec test_proc

S>rollback tran aa
S>


S>Имеем


S>

S>Msg 266, Level 16, State 2, Procedure test_proc, Line 0
S>Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing. Previous count = 1, current count = 0.
S>Msg 3903, Level 16, State 1, Line 5
S>The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION.



S>Почему такое происходит?


S>MSDN:


S>

S>В хранимых процедурах инструкция ROLLBACK TRANSACTION без аргументов savepoint_name или transaction_name откатывает все инструкции к самой внешней инструкции BEGIN TRANSACTION. Вызов инструкции ROLLBACK TRANSACTION в хранимой процедуре является причиной того, что значение @@TRANCOUNT после завершения хранимой процедуры отличается от значения @@TRANCOUNT при выдаче хранимой процедурой информационного сообщения. Это сообщение не влияет на последующую обработку.


S>Из выделенного непонятно, должна ли откатываться самая внешняя транзакция А если должна, то как сделать чтобы не она не откатывалась? transaction name дать тоже не получается.



alter procedure test_proc
as
SAVE tran cc

ROLLBACK tran cc 
return 


go 

begin tran aa

exec test_proc

rollback tran aa

~~~~~
~lol~~
~~~ Single Password Solution
Re[2]: [MSSQL]Встроенные процедуры+транзакции
От: Sshur Россия http://shurygin-sergey.livejournal.com
Дата: 11.02.10 09:20
Оценка:
Здравствуйте, Caracrist, Вы писали:

C>
C>alter procedure test_proc
C>as
C>SAVE tran cc

C>ROLLBACK tran cc 
C>return 


C>go 

C>begin tran aa

C>exec test_proc

C>rollback tran aa
C>

C>


За save transaction спасибо, но у меня не получится, так как внешняя транзакция может быть, а может и не быть

получается надо тогда что-то типа

alter procedure test_proc
as
if @@trancount=0
  begin tran cc
else
 SAVE tran cc

ROLLBACK tran cc 
return



Ну и хотелось бы все-таки разобраться, откат транзакции внутри хранимки действительно откатывает все внешние, или нет
Шурыгин Сергей

"Не следует преумножать сущности сверх необходимости" (с) Оккам
Re[3]: [MSSQL]Встроенные процедуры+транзакции
От: Caracrist https://1pwd.org/
Дата: 11.02.10 09:25
Оценка:
Здравствуйте, Sshur, Вы писали:

S>За save transaction спасибо, но у меня не получится, так как внешняя транзакция может быть, а может и не быть



alter procedure test_proc
as
BEGIN TRAN
SAVE tran cc

ROLLBACK tran cc 
COMMIT TRAN
return 
go 
begin tran aa
exec test_proc
rollback tran aa




S>Ну и хотелось бы все-таки разобраться, откат транзакции внутри хранимки действительно откатывает все внешние, или нет


Говорят что да.

ROLLBACK TRANSACTION without a savepoint_name or transaction_name rolls back to the beginning of the transaction. When nesting transactions, this same statement rolls back all inner transactions to the outermost BEGIN TRANSACTION statement. In both cases, ROLLBACK TRANSACTION decrements the @@TRANCOUNT system function to 0. ROLLBACK TRANSACTION savepoint_name does not decrement @@TRANCOUNT.

~~~~~
~lol~~
~~~ Single Password Solution
Re: [MSSQL]Встроенные процедуры+транзакции
От: vmpire Россия  
Дата: 11.02.10 10:14
Оценка: -1
Здравствуйте, Sshur, Вы писали:

S>Из выделенного непонятно, должна ли откатываться самая внешняя транзакция А если должна, то как сделать чтобы не она не откатывалась?

Никак, MSSQL не поддерживает вложенных транзакций

S> transaction name дать тоже не получается.

Может, так подойдёт?
S>
S>create procedure test_proc
S>as
S>begin tran 

S>ROLLBACK transaction 
S>return 
S>go 

S>begin tran aa

S>exec test_proc

S>if @@TRANCOUNT > 0 rollback tran aa
S>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.