2016-02-19 15 views
0
SELECT @@TRANCOUNT 
BEGIN TRAN T1  
SELECT @@TRANCOUNT 
    BEGIN TRAN T2    
    SELECT @@TRANCOUNT 
    ROLLBACK TRAN T2   
SELECT @@TRANCOUNT 
ROLLBACK TRAN T1 
SELECT @@TRANCOUNT   

Я хочу обсудить на @@ trancount на мгновение. Есть пять @@ trancount. Первый имеет значение 0. Второй имеет значение 1. третий имеет значение 2. до четвертого транскона, он сталкивается с ошибкой (поскольку контрольная точка сохранения для отката отсутствует), поэтому значение 2 будет продолжено. До этого я получаю логику. Проблема возникает при последнем @@ trancount, так как она также должна сталкиваться с ошибкой (согласно моим половинным знаниям), поскольку нет точки сохранения для отката и, следовательно, она должна сохранять значение 2. Но вместо этого он показывает результат как 0. Пожалуйста, помогите мне узнать, почему последний trancount равен 0, а не 2.Счет транзакции SQL Server

+0

Найдите минутку, чтобы прочитать [редактирование справки] (http://stackoverflow.com/editing-help) в справочном центре. Форматирование переполнения стека отличается от других сайтов. Чем лучше выглядит ваш пост, тем проще будет пользователям помочь вам. –

+0

Ваш скрипт терпит неудачу, ROLLBACK TRAN имя транзакции должно ссылаться на самое внешнее имя транзакции, иначе оно не удастся. – Jaco

ответ

0

ROLLBACK TRAN имя_контакта должно относиться к самому удаленному имени транзакции, иначе оно не удастся. Вы можете исправить свой сценарий как этот

SELECT @@TRANCOUNT 
BEGIN TRAN T1  
SELECT @@TRANCOUNT 
    BEGIN TRAN T2    
    SELECT @@TRANCOUNT 
    ROLLBACK TRAN T1 
SELECT @@TRANCOUNT 
IF @@TRANCOUNT>0 
    ROLLBACK TRAN T1 
SELECT @@TRANCOUNT  

Пожалуйста, обратите внимание, что вы можете использовать COMMMIT TRAN T2

0

Вы можете попробовать SAVE TRAN или откат будет влиять на всю транзакцию, так как не было определено точки сохранения.

SELECT @@TRANCOUNT 
BEGIN TRAN t1 
SELECT @@TRANCOUNT 
    BEGIN TRAN T2 
    SAVE TRAN T2 --<< 
    SELECT @@TRANCOUNT 
    ROLLBACK TRAN T2 
SELECT @@TRANCOUNT 
ROLLBACK TRAN t1 
SELECT @@TRANCOUNT 

https://msdn.microsoft.com/en-us/library/ms187967.aspx

Бегин приращений TRANSACTION выписки @@ TRANCOUNT на 1. ROLLBACK TRANSACTION декрементирует @@ TRANCOUNT 0, для ROLLBACK TRANSACTION savepoint_name, который не влияет на @@ TRANCOUNT исключением. COMMIT TRANSACTION или COMMIT РАБОТЫ декремент @@ TRANCOUNT от 1.

Nice статьи: http://www.codeproject.com/Articles/4451/SQL-Server-Transactions-and-Error-Handling

Рисунок 1: ПОРУЧАТЬ всегда уравновешивает BEGIN TRANSACTION за счет уменьшения счетчика транзакций на единицу. enter image description here

Рисунок 2: Один ROLLBACK всегда выполняет откат всей транзакции. enter image description here

Точки сохранения предлагает механизм отката части операций. A пользователь может установить точку сохранения или маркер в транзакции. Точка сохранения определяет местоположение, в которое может возвращаться транзакция, если часть транзакции условно аннулирована. SQL Server позволяет вам использовать точки сохранения с помощью инструкции SAVE TRAN, которая не влияет на значение @@ TRANCOUNT. Откат к точке сохранения (а не транзакции) не влияет на значение, возвращаемое @@ TRANCOUNT. Тем не менее, откат должен явно указывать точку сохранения: использование ROLLBACK TRAN без определенного имени будет всегда откатывать всю транзакцию.

+0

Благодарим вас за ответ. Но я хочу обсудить на @@ trancount на мгновение.Есть пять @@ trancount. Первый имеет значение 0. Второй имеет значение 1. Третий имеет значение 2. до четвертого транскона, он сталкивается с ошибкой (поскольку контрольная точка сохранения для отката отсутствует), поэтому значение 2 будет продолжено. До этого я получаю логику. Проблема возникает в последнем @@ trancount, так как она также должна встречаться с ошибкой, так как нет точки сохранения для отката и сохранения 2. Но вместо этого она показывает результат как 0. Пожалуйста, помогите мне узнать, почему последний trancount равен 0 вместо of 2. – 234

+0

Извините, я не вижу, где проблема. T1 - вся транзакция. Остановите его с помощью 'BEGIN TRAN EXEC ('... source from answer ...') SELECT @@ TRANCOUNT ROLLBACK', и вы получите сообщение об ошибке для точки сохранения для T1. Потому что он стал вложенной транзакцией. –

Смежные вопросы