Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Броят на транзакциите след EXECUTE показва несъответстващ брой изрази BEGIN и COMMIT. Предишен брой =1, текущ брой =0

Ако имате блок TRY/CATCH, вероятната причина е, че улавяте изключение за прекъсване на транзакция и продължавате. В блока CATCH винаги трябва да проверявате XACT_STATE() и да обработва подходящи прекъснати и незадължителни (обречени) транзакции. Ако вашият повикващ започне транзакция и calee удари, да речем, блокиране (което прекратява транзакцията), как извикваният ще съобщи на повикващия, че транзакцията е била прекъсната и не трябва да продължи с „бизнес както обикновено“? Единственият осъществим начин е да се повдигне повторно изключение, принуждавайки повикващия да се справи със ситуацията. Ако мълчаливо преглътнете прекратена транзакция и повикващият продължи да приема, че все още е в оригиналната транзакция, само хаос може да гарантира (а грешката, която получавате, е начинът, по който машината се опитва да се защити).

Препоръчвам ви да прегледате Обработка на изключения и вложени транзакции което показва шаблон, който може да се използва с вложени транзакции и изключения:

create procedure [usp_my_procedure_name]
as
begin
    set nocount on;
    declare @trancount int;
    set @trancount = @@trancount;
    begin try
        if @trancount = 0
            begin transaction
        else
            save transaction usp_my_procedure_name;

        -- Do the actual work here

lbexit:
        if @trancount = 0
            commit;
    end try
    begin catch
        declare @error int, @message varchar(4000), @xstate int;
        select @error = ERROR_NUMBER(), @message = ERROR_MESSAGE(), @xstate = XACT_STATE();
        if @xstate = -1
            rollback;
        if @xstate = 1 and @trancount = 0
            rollback
        if @xstate = 1 and @trancount > 0
            rollback transaction usp_my_procedure_name;

        raiserror ('usp_my_procedure_name: %d: %s', 16, 1, @error, @message) ;
    end catch
end
go


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да конвертирате низ в дата/час в SQL Server с помощта на CONVERT()

  2. Как да активирате XPs на агент на SQL Server с помощта на T-SQL

  3. SQL:Получаване на брой от много таблици за потребителски запис в таблица USER. Какъв е най-добрият подход?

  4. Как да умножите всички стойности в колона с SQL като SUM()

  5. Подзаявка, използваща Exists 1 или Exists *