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