SQL सर्वर वास्तव में नेस्टेड लेनदेन का समर्थन नहीं करता है। एक समय में केवल एक ही लेन-देन होता है।
इस एक लेन-देन में एक मूल नेस्टेड लेनदेन काउंटर है, @@TRANCOUNT
. लगातार हर begin transaction
काउंटर को एक-एक करके बढ़ाता है, प्रत्येक commit transaction
एक से कम कर देता है। केवल commit
जो काउंटर को 0 तक कम कर देता है वास्तव में एक लेनदेन करता है।
एक rollback transaction
एक लेन-देन को पूर्ववत करता है और @@TRANCOUNT
. को साफ़ करता है ।
आपके मामले में, मज़ेदार परिणाम यह है कि SqlStatement3 बाहर चलाया जाता है एक लेनदेन! आपका अंतिम commit
एक "कमिट ट्रांज़ेक्शन अनुरोध में कोई संगत BEGIN TRANSACTION नहीं है" अपवाद फेंक देगा, लेकिन SqlStatement3 के प्रभाव स्थायी हैं।
उदाहरण के लिए:
create table #t (col1 int)
insert #t (col1) values (1)
BEGIN TRANSACTION
update #t set col1 = 2 -- This gets rolled back
BEGIN TRANSACTION
update #t set col1 = 3 -- This gets rolled back too
ROLLBACK TRANSACTION
update #t set col1 = 4 -- This is run OUTSIDE a transaction!
COMMIT TRANSACTION -- Throws error
select col1 from #t
प्रिंट करता है 4
. सचमुच। :)पी>