Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Błąd transakcji SQL:bieżąca transakcja nie może zostać zatwierdzona i nie może obsługiwać operacji zapisu do pliku dziennika

Zawsze musisz sprawdzić XACT_STATE() , nieistotne dla XACT_ABORT ustawienie. Mam przykład szablonu procedur składowanych, które muszą obsługiwać transakcje w kontekście TRY/CATCH pod adresem Obsługa wyjątków i zagnieżdżone transakcje :

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. Jak liczyć puste tabele w bazie danych?

  2. W jaki sposób strefa czasowa jest obsługiwana w cyklu życia kolumny DateTime ADO.NET + SQL Server?

  3. Jak wykryć, czy wartość zawiera co najmniej jedną liczbę w SQL Server?

  4. Jak wykonać plik .sql za pomocą powershell?

  5. dlaczego varchar(max) nie przechowuje danych więcej niż 8000 znaków