Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

नेस्टेड लेनदेन के आंतरिक लेनदेन को रोलबैक करें

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 . सचमुच। :)

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. एक चर के रूप में एक तालिका का नाम

  2. SQL सर्वर 2005 संख्यात्मक सटीक हानि

  3. PI () SQL सर्वर में उदाहरण

  4. एसक्यूएल संग्रहीत प्रक्रिया पैरामीटर दूषित हो रहा है?

  5. डालने के दौरान सी # में एसक्यूएल अद्वितीय बाधा उल्लंघन पकड़ने का सबसे अच्छा तरीका