Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Số lượng giao dịch sau khi THỰC HIỆN cho biết số lượng câu lệnh BEGIN và COMMIT không khớp. Số lượng trước đây =1, số lượng hiện tại =0

Nếu bạn có khối TRY / CATCH thì nguyên nhân có thể là bạn đang bắt một ngoại lệ hủy bỏ giao dịch và tiếp tục. Trong khối CATCH, bạn phải luôn kiểm tra XACT_STATE () và xử lý các giao dịch bị hủy bỏ và không thể bắt buộc (bị hủy bỏ) thích hợp. Nếu người gọi của bạn bắt đầu một giao dịch và lịch trình xảy ra, chẳng hạn như bế tắc (đã hủy bỏ giao dịch), làm thế nào người gọi sẽ thông báo với người gọi rằng giao dịch đã bị hủy bỏ và nó sẽ không tiếp tục với 'hoạt động kinh doanh như bình thường'? Cách khả thi duy nhất là nâng lại một ngoại lệ, buộc người gọi phải xử lý tình huống. Nếu bạn âm thầm nuốt một giao dịch đã hủy bỏ và người gọi tiếp tục giả sử vẫn còn trong giao dịch ban đầu, thì chỉ có tình trạng lộn xộn mới có thể đảm bảo (và lỗi bạn nhận được là cách động cơ cố gắng bảo vệ chính nó).

Tôi khuyên bạn nên xem qua Xử lý ngoại lệ và giao dịch lồng nhau hiển thị một mẫu có thể được sử dụng với các giao dịch và ngoại lệ lồng nhau:

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. truy vấn sql cho sự khác biệt giữa hàng hiện tại và hàng trước đó dựa trên ngày giờ

  2. Sử dụng WITH PERMISSION_SET =UNSAFE cho một hợp ngữ trong SQL 2005 có tệ không?

  3. chọn từng nút xml bằng SQL

  4. SQL Server:Làm cách nào để tìm nạp dữ liệu từ nhiều bảng động?

  5. ms sql truy vấn về số lần xuất hiện của các từ trong cột văn bản