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

TSQL Thử / Bắt trong Giao dịch hay ngược lại?

Chỉ mở giao dịch khi bạn đang ở trong TRY chặn và ngay trước câu lệnh thực, và cam kết nó ngay lập tức. Đừng đợi quyền kiểm soát của bạn chuyển đến cuối đợt để thực hiện các giao dịch của bạn.

Nếu có sự cố xảy ra khi bạn đang ở trong TRY khối và bạn đã mở một giao dịch, điều khiển sẽ chuyển đến CATCH khối. Chỉ cần khôi phục giao dịch của bạn ở đó và thực hiện xử lý lỗi khác theo yêu cầu.

Tôi đã thêm một séc nhỏ cho bất kỳ giao dịch đang mở nào bằng cách sử dụng @@TRANCOUNT trước khi thực sự quay trở lại giao dịch. Nó không thực sự có nhiều ý nghĩa trong kịch bản này. Nó hữu ích hơn khi bạn đang thực hiện một số kiểm tra xác thực trong TRY của mình chặn trước khi bạn mở một giao dịch như kiểm tra các giá trị tham số và các nội dung khác và tăng lỗi trong TRY chặn nếu bất kỳ kiểm tra xác thực nào không thành công. Trong trường hợp đó, điều khiển sẽ chuyển đến CATCH khối mà không cần mở giao dịch. Ở đó, bạn có thể kiểm tra bất kỳ giao dịch đang mở nào và hoàn trả nếu có bất kỳ giao dịch nào đang mở. Trong trường hợp của bạn, bạn thực sự không cần phải kiểm tra bất kỳ giao dịch đang mở nào vì bạn sẽ không nhập CATCH chặn trừ khi có sự cố xảy ra bên trong giao dịch của bạn.

Đừng hỏi sau khi bạn đã thực hiện DELETE hoạt động cho dù nó cần được cam kết hoặc quay trở lại; thực hiện tất cả các xác thực này trước khi mở giao dịch. Khi một giao dịch được mở, hãy cam kết ngay lập tức và trong trường hợp có bất kỳ lỗi nào, hãy xử lý lỗi (bạn đang làm rất tốt khi nhận được thông tin chi tiết bằng cách sử dụng hầu hết các chức năng lỗi).

BEGIN TRY

  BEGIN TRANSACTION SCHEDULEDELETE
    DELETE   -- delete commands full SQL cut out
    DELETE   -- delete commands full SQL cut out
    DELETE   -- delete commands full SQL cut out
 COMMIT TRANSACTION SCHEDULEDELETE
    PRINT 'X rows deleted. Operation Successful Tara.' --calculation cut out.
END TRY

BEGIN CATCH 
  IF (@@TRANCOUNT > 0)
   BEGIN
      ROLLBACK TRANSACTION SCHEDULEDELETE
      PRINT 'Error detected, all changes reversed'
   END 
    SELECT
        ERROR_NUMBER() AS ErrorNumber,
        ERROR_SEVERITY() AS ErrorSeverity,
        ERROR_STATE() AS ErrorState,
        ERROR_PROCEDURE() AS ErrorProcedure,
        ERROR_LINE() AS ErrorLine,
        ERROR_MESSAGE() AS ErrorMessage
END CATCH


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cơ sở dữ liệu sao lưu SQL Server Express | Cách lập lịch trình tự động hóa và dọn dẹp sao lưu SQL Express

  2. Chỉ có thể chỉ định một biểu thức trong danh sách chọn khi truy vấn con không được giới thiệu với EXISTS

  3. Sử dụng IDENT_CURRENT () để trả lại giá trị nhận dạng hiện tại trên cột nhận dạng trong SQL Server

  4. Ví dụ về ROUND () trong SQL Server

  5. Khóa chính tổng hợp so với cột ID bổ sung?