MS SQL пытается перехватить транзакцию

#sql #sql-server #ssms

#sql #sql-сервер #ssms

Вопрос:

Мне нужно знать, правильно ли указан приведенный ниже sql, чтобы выполнить откат, если произойдет что-то плохое.

Сначала я создаю временную таблицу

 IF OBJECT_ID(N'tempdb..#LocalSummery') IS NOT NULL 
DROP TABLE #LocalSummery  
CREATE TABLE  #LocalSummery (
 

затем я заполняю таблицу

 insert into #LocalSummery'
SELECT *....
 

затем я запускаю try catch

 BEGIN TRY
 BEGIN TRANSACTION 

delete from LocalSummeryRealTable
INSERT INTO LocalSummeryRealTable
SELECT S.*
FROM  #LocalSummery'    AS S 
COMMIT

END TRY

BEGIN CATCH


       IF @@TRANCOUNT > 0
              ROLLBACK TRANSACTION 
...
 

Я заметил, что когда я вставлял в LocalSummeryRealTable, поля не выстраивались в линию, и я получил сообщение об ошибке. Я ожидал отката, но в окне запроса SSMS он выдал мне сообщение о том, что транзакция не была зафиксирована, и спросил меня, хочу ли я ее зафиксировать. Почему это должно спросить меня, когда оно должно быть откатано?

Комментарии:

1. Ваш коммит не должен быть, если @@tranccount не равен> 0.

2. Также какова цель, если try catch, если вы используете транзакции…. Я на самом деле задаю этот вопрос для моей собственной информации.

3. @logixologist BEGIN TRANSACTION увеличивается @@TRANCOUNT на 1, поэтому при COMMIT попадании в синтаксис выше, это будет 1 . Я считаю, что логика попытки OP такова: «Попробуйте следующее… если мы добираемся до последней строки без ошибок, тогда мы фиксируем. Если есть ошибка, отправьте нас в раздел CATCH. Если мы начали транзакцию, откатите ее «.

4. Я всегда выполнял откат, если @@error> 0.

5. @Santi это вообще необходимо?