2013-08-23 5 views
2

Я использую ниже SQL для удаления записей и вставки в таблицу Customers внутри транзакции. Если в операторах вставки есть ошибка, я вижу сообщение об ошибке, и когда я пытаюсь выполнить select * from customers, он не отображает набор результатов. И когда я закрываю окно SSMS, он показывает There are uncommitted transactions. Do you wish to commit these transactions before closing the window?SQL Transaction не работает

После того, как я нажму OK, результаты будут отображаться из таблицы. Итак, существует ли какой-либо механизм блокировки при использовании транзакции.

USE CMSDB; 
BEGIN TRY 
    BEGIN TRAN t1; 

     DELETE FROM Customers 
     print @@trancount -->prints 3 since there are three records 
     INSERT INTO CUSTOMERS 
     INSERT INTO CUSTOMERd --> error here 
     INSERT INTO CUSTOMERS 

    COMMIT TRAN t1; 
END TRY 
BEGIN CATCH 
    print 'hi' --> not printing 
    select @@trancount --> not resulting anything 
    IF @@TRANCOUNT > 0 
     ROLLBACK TRAN t1; 
    -- Error Message 
    DECLARE @Err nvarchar(1000) 
    SET @Err = ERROR_MESSAGE() 
    RAISERROR (@Err,16,1) 
END CATCH 
GO 

Сообщение

(3 row(s) affected) 

(1 row(s) affected) 

(1 row(s) affected) 

(1 row(s) affected) 
Msg 208, Level 16, State 1, Line 8 
Invalid object name 'dbo.Customerd'. 
+2

Похоже, что в какой-то момент (перед запуском этой последней партии) вы выделили только код с 'BEGIN TRANSACTION; '. Что означает 'SELECT @@ TRANCOUNT',' say? –

+0

Кажется, что он почему-то не попадает в улов. Я попытался напечатать @@ trancount в уловке, но не смог. – Sunny

+0

Просто 'SELECT @@ TRANCOUNT;' самостоятельно. Опять же, я думаю, что в какой-то момент вы выполнили хотя бы один «BEGIN TRANSACTION», не совершая его или не отбрасывая. –

ответ

1

Выдержка из TRY…CATCH описание:

следующие типы ошибок не обрабатываются с помощью CATCH блока, когда они происходят на том же уровне исполнения, что и TRY ... Конструкция CATCH:

  • Скомпилируйте ошибки, такие как синтаксические ошибки, которые препятствуют запуску пакета.

  • Ошибка, возникающая при заявлении на уровне перекомпиляции, такие как ошибки разрешения имен объектов, которые происходят после компиляции из-за отсроченным разрешения имен.

В этом случае, что происходит это

ошибка не перехватывается и управление переходит из Try ... Catch построить к следующему более высокому уровню.

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