Câu trả lời cho câu hỏi của bạn phụ thuộc vào SET XACT_ABORT
cài đặt:
Ví dụ, hãy thử đoạn mã sau. Phép chia đầu tiên cho 0 gây ra lỗi nhưng vẫn tiếp tục thực thi . Phép chia thứ hai cho 0 gây ra lỗi và tạm dừng thực thi:
begin transaction
set xact_abort off
select 1 / 0 -- causes divide by zero error, but continues
select @@trancount -- returns 1
set xact_abort on
select 1 / 0 -- causes divide by zero error and terminates execution
select @@trancount -- we never get here
rollback
Nếu XACT_ABORT BẬT, thì lỗi sẽ hủy bỏ giao dịch và bạn không cần THỬ / MÈO.
Nếu XACT_ABORT TẮT, bạn sẽ cần kiểm tra trạng thái của từng câu lệnh để xem có lỗi xảy ra không:
begin transaction
delete from...
if @@error <> 0
begin
if @@trancount > 0
rollback
return
end
insert into...
if @@error <> 0
begin
if @@trancount > 0
rollback
return
end
commit
Tuy nhiên, nếu bạn từng tìm thấy trường hợp cần THỬ / MÈO, bạn có thể cần phải làm điều gì đó đặc biệt khi lỗi xảy ra. Nếu vậy, đừng quên THỬ / MÈO xử lý ngoại lệ:
begin transaction
set xact_abort on
begin try
select 1 / 0 -- causes divide by zero error and terminates execution
select @@trancount -- we never get here
commit
end try
begin catch
select xact_state() -- this will be -1 indicating you MUST rollback before doing any other operations
select @@trancount -- this will probably be one, because we haven't ended the transaction yet
if xact_state() <> 0
begin try
select 'rollback'
rollback
-- do something to handle or record the error before leaving the current scope
select 'exception processing here'
--insert into...
end try
begin catch
-- ignore rollback errors
end catch
end catch