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

Грешка при SQL транзакция:Текущата транзакция не може да бъде ангажирана и не може да поддържа операции, които записват в регистрационния файл

Винаги трябва да проверявате за XACT_STATE() , без значение от XACT_ABORT настройка. Имам пример за шаблон за съхранени процедури, които трябва да обработват транзакции в контекста TRY/CATCH на Обработка на изключения и вложени транзакции :

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Преобразуване във формат mm/dd/yyyy

  2. Как да добавите ограничение по подразбиране към съществуващи колони в таблица на SQL Server - SQL Server / TSQL Урок, част 91

  3. nvarchar(max) все още се съкращава

  4. Как да декодирате base64 unicode низ с помощта на T-SQL

  5. Как да внедрим условна съхранена процедура Upsert?