आपके प्रश्न का उत्तर SET XACT_ABORT
पर निर्भर करता है।
सेटिंग:
उदाहरण के लिए, निम्न कोड का प्रयास करें। 0 से पहला भाग त्रुटि उत्पन्न करता है लेकिन निष्पादन जारी रखता है . शून्य से दूसरा भाग त्रुटि उत्पन्न करता है और निष्पादन रोक देता है:
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
यदि XACT_ABORT चालू है, तो त्रुटियां लेन-देन को रोक देंगी, और आपको TRY / CATCH की आवश्यकता नहीं है।
यदि XACT_ABORT बंद है, तो आपको यह देखने के लिए प्रत्येक कथन की स्थिति की जांच करनी होगी कि क्या कोई त्रुटि हुई है:
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
हालाँकि, यदि आपको कभी कोई ऐसा मामला मिलता है जहाँ आपको TRY / CATCH की आवश्यकता होती है, तो त्रुटि होने पर आपको कुछ विशेष करने की आवश्यकता हो सकती है। यदि ऐसा है, तो अपवाद से निपटने के लिए TRY / CATCH करना न भूलें:
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