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

Откуда:
Сообщений: 477
rollback в хранимой процедуре откатывают всю вложенную транзакцию (tr1) при этом ругается "transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing" и естественно принадлежащий ей rollback (tr1) не видит начала т.к. она уже откатилась
вопрос в следующем. допустим я уберу последний rollback но ведь первое сообщение будет появляться. Я что-нибудь неправильно делаю?

код:
CREATE PROCEDURE testproc AS
begin tran
print 'процедура уровень вложенности '+cast(@@trancount as char(2))
rollback tran
GO
exec testproc
begin tran tr1
print 'уровень вложенности '+cast(@@trancount as char(2))
exec testproc
print 'уровень вложенности '+cast(@@trancount as char(2))
rollback tran tr1

результат:

процедура уровень вложенности 1
уровень вложенности 1
процедура уровень вложенности 2
Server: Msg 266, Level 16, State 2, Procedure testproc, Line 4
Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing. Previous count = 1, current count = 0.
уровень вложенности 0
Server: Msg 3903, Level 16, State 1, Line 6
The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION.
28 мар 06, 15:19    [2497948]     Ответить | Цитировать Сообщить модератору
 Re: Это ошибка???  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
В MS SQL нет вложенных транзакций и ROLLBACK откатывает до самого "верхнего" BEGIN.
28 мар 06, 15:27    [2498000]     Ответить | Цитировать Сообщить модератору
 Re: Это ошибка???  [new]
csm
Member [заблокирован]

Откуда:
Сообщений: 477
=) я как бы это понял уже но почему ругается тогда молча бы уже откатывала все
28 мар 06, 15:42    [2498083]     Ответить | Цитировать Сообщить модератору
 Re: Это ошибка???  [new]
csm
Member [заблокирован]

Откуда:
Сообщений: 477
и ещё вот из книги пример получается вложенные транзакции есть и их даже нужно фиксировать все но вот откатывать нельзя (((
а где такое можно кстати? может в 2005?
BEGIN TRAN tr1
PRINT 'Текущий уровень вложенности: '+CAST(@@TRANCOUNT AS char(2))
BEGIN TRAN tr2
PRINT 'Текущий уровень вложенности: '+CAST(@@TRANCOUNT AS char(2))
BEGIN TRAN tr3
PRINT 'Текущий уровень вложенности: '+CAST(@@TRANCOUNT AS char(2))
BEGIN TRAN tr4
PRINT 'Текущий уровень вложенности: '+CAST(@@TRANCOUNT AS char(2))
BEGIN TRANSACTION tr5
SAVE TRANSACTION aaa
PRINT 'Текущий уровень вложенности: '+CAST(@@TRANCOUNT AS char(2))
ROLLBACK TRANSACTION aaa
PRINT 'Текущий уровень вложенности: '+CAST(@@TRANCOUNT AS char(2))
COMMIT TRANSACTION tr5
PRINT 'Текущий уровень вложенности: '+CAST(@@TRANCOUNT AS char(2))
COMMIT TRAN tr4
PRINT 'Текущий уровень вложенности: '+CAST(@@TRANCOUNT AS char(2))
ROLLBACK TRAN
PRINT 'Текущий уровень вложенности: '+CAST(@@TRANCOUNT AS char(2))
28 мар 06, 15:46    [2498104]     Ответить | Цитировать Сообщить модератору
 Re: Это ошибка???  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Да потому что вот здесь:

автор
exec testproc
begin tran tr1
print 'уровень вложенности '+cast(@@trancount as char(2))
exec testproc
print 'уровень вложенности '+cast(@@trancount as char(2))
rollback tran tr1


У Вас с учетом кода в хп идет подряд два BEGIN, затем ROLLBACK в хп (что откатывает все в ноль) и снова ROLLBACK, что и вызывает ошибку 3903. А ошибка 266 говорит о том, что до входа в хп была открытая транзакция, а после выхода ее не стало, что, в принципе есть ошибка разработки.
28 мар 06, 15:46    [2498105]     Ответить | Цитировать Сообщить модератору
 Re: Это ошибка???  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Сэйвпоинты <> вложенные транзакции.
28 мар 06, 15:47    [2498106]     Ответить | Цитировать Сообщить модератору
 Re: Это ошибка???  [new]
csm
Member [заблокирован]

Откуда:
Сообщений: 477
tr4 <> savepoint
28 мар 06, 15:54    [2498151]     Ответить | Цитировать Сообщить модератору
 Re: Это ошибка???  [new]
csm
Member [заблокирован]

Откуда:
Сообщений: 477
Так на главный вопрос который меня моучает ответте пожалуйста
Мне теперь менять код чтобы не возникало ролбека всех транзакций или можно оставить как есть сообщение нигде не палится кроме отладки и всё работает как надо вроде бы
28 мар 06, 15:57    [2498168]     Ответить | Цитировать Сообщить модератору
 Re: Это ошибка???  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Код Вам надо менять, однозначно. Т.е. хп должна быть написана так, чтобы она могла работать как при наличии "внешней" транзакции, так и без оной, не выдавая сообщение об ошибке.
28 мар 06, 16:01    [2498200]     Ответить | Цитировать Сообщить модератору
 Re: Это ошибка???  [new]
csm
Member [заблокирован]

Откуда:
Сообщений: 477
Спасибо за беседу действительно в дельфи возникает странная ситуация когда возникает данная ошибка в хранимой процедуре пропускаются в отладке несколько последующих команд так что код я поменял и из процедуры выходит да начала транзакции без ролбэка
28 мар 06, 16:08    [2498244]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить