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

SQL सर्वर में निहित लेनदेन कैसे काम करते हैं

SQL सर्वर में चार लेन-देन मोड हैं। इनमें से एक निहित विधा है।

SQL सर्वर में, एक अंतर्निहित लेन-देन तब होता है जब एक नया लेन-देन परोक्ष रूप से शुरू होता है जब पूर्व लेनदेन पूरा हो जाता है, लेकिन प्रत्येक लेनदेन एक COMMIT के साथ स्पष्ट रूप से पूरा होता है या ROLLBACK बयान।

इसे ऑटोकॉमिट मोड के साथ भ्रमित नहीं होना चाहिए, जहां लेनदेन शुरू होता है और निहित रूप से समाप्त होता है।

चार लेन-देन मोड

SQL सर्वर निम्नलिखित लेनदेन मोड में काम कर सकता है:

<थ>विवरण
लेन-देन मोड
अपने आप लेन-देन करें प्रत्येक व्यक्तिगत विवरण एक लेन-देन है।
अंतर्निहित लेनदेन एक नया लेन-देन परोक्ष रूप से तब शुरू होता है जब पिछला लेन-देन पूरा हो जाता है, लेकिन प्रत्येक लेन-देन स्पष्ट रूप से पूरा हो जाता है, आमतौर पर COMMIT के साथ या ROLLBACK डीबीएमएस के आधार पर बयान।
स्पष्ट लेन-देन स्पष्ट रूप से एक पंक्ति के साथ प्रारंभ किया गया जैसे START TRANSACTION , BEGIN TRANSACTION या इसी तरह, डीबीएमएस के आधार पर, और स्पष्ट रूप से प्रतिबद्ध या प्रासंगिक बयानों के साथ वापस ले लिया।
बैच के दायरे वाला लेन-देन केवल एकाधिक सक्रिय परिणाम सेट (MARS) पर लागू। MARS सत्र के तहत शुरू होने वाला एक स्पष्ट या निहित लेन-देन एक बैच-स्कोप्ड लेनदेन बन जाता है।

अंतर्निहित मोड बनाम Autocommit

SQL सर्वर में, कुछ कथन चलने पर स्वचालित रूप से लेनदेन प्रारंभ करते हैं। ऐसा लगता है जैसे उनके सामने एक अदृश्य BEGIN TRANSACTION . था बयान।

ज्यादातर मामलों में, ये लेन-देन भी परोक्ष रूप से प्रतिबद्ध होते हैं, जैसे कि कोई अदृश्य COMMIT TRANSACTION था। बयान। इस तरह के लेन-देन ऑटोकॉमिट मोड . में कहे जाते हैं .

अन्य मामलों में, कोई अदृश्य COMMIT TRANSACTION नहीं है अदृश्य BEGIN TRANSACTION . से मिलान करने के लिए बयान। लेन-देन तब तक जारी रहता है जब तक आप इसे स्पष्ट रूप से प्रतिबद्ध नहीं करते हैं या इसे COMMIT TRANSACTION के साथ वापस रोल नहीं करते हैं। या ROLLBACK TRANSACTION बयान। इस मामले में, लेन-देन अंतर्निहित मोड . में कहा जाता है .

लेन-देन निहित मोड में चलता है या ऑटोकॉमिट मोड आपके IMPLICIT_TRANSACTIONS पर निर्भर करता है सेटिंग।

एक निहित लेनदेन शुरू करने वाले कथन

निम्न कथन SQL सर्वर में एक अंतर्निहित लेनदेन प्रारंभ करते हैं।

  • ALTER TABLE
  • BEGIN TRANSACTION
  • CREATE
  • DELETE
  • DROP
  • FETCH
  • GRANT
  • INSERT
  • OPEN
  • REVOKE
  • SELECT (उन लोगों को छोड़कर जो किसी तालिका से चयन नहीं करते हैं, जैसे SELECT GETDATE() या SELECT 1*1 )
  • TRUNCATE TABLE
  • UPDATE

जब भी आप इन टी-एसक्यूएल स्टेटमेंट को चलाते हैं, तो आप लेनदेन शुरू कर रहे हैं। अधिकांश समय लेन-देन स्वचालित रूप से प्रतिबद्ध हो जाएगा। तो आपने स्पष्ट रूप से ऐसा किए बिना ही लेन-देन शुरू और समाप्त कर दिया।

हालांकि, आपके IMPLICIT_TRANSACTIONS . के आधार पर सेटिंग, आपको स्पष्ट रूप से लेनदेन करने की आवश्यकता हो सकती है।

जब IMPLICIT_TRANSACTIONS OFF है

जब आपका IMPLICIT_TRANSACTIONS सेटिंग OFF है , उपरोक्त कथन ऑटोकॉमिट मोड में लेनदेन करते हैं। यानी, वे और . शुरू करते हैं लेन-देन को परोक्ष रूप से समाप्त करें।

तो यह एक अदृश्य BEGIN TRANSACTION . होने जैसा है स्टेटमेंट और एक अदृश्य COMMIT TRANSACTION कथन, सभी एक कथन से।

इस मामले में, आपको लेन-देन करने या रोलबैक करने के लिए कुछ भी करने की आवश्यकता नहीं है। यह आपके लिए पहले ही किया जा चुका था।

जब IMPLICIT_TRANSACTIONS ON है

जब आपका IMPLICIT_TRANSACTIONS सेटिंग ON है , उपरोक्त कथन थोड़ा भिन्न व्यवहार करते हैं।

जब IMPLICIT_TRANSACTIONS सेटिंग ON है , उपरोक्त कथनों को एक अदृश्य BEGIN TRANSACTION . मिलता है स्टेटमेंट लेकिन उन्हें संबंधित COMMIT TRANSACTION . नहीं मिलता है बयान।

इसका मतलब है कि आपको लेन-देन को स्पष्ट रूप से स्वयं करने या रोलबैक करने की आवश्यकता है।

हालाँकि, जब लेन-देन मोड निहित होता है, तो कोई अदृश्य BEGIN TRANSACTION . नहीं होता है जारी किया जाता है यदि कोई लेनदेन पहले से ही प्रगति पर है।

उदाहरण

अवधारणा को प्रदर्शित करने के लिए यहां एक उदाहरण दिया गया है।

SELECT @@TRANCOUNT AS TransactionCount;
SET IMPLICIT_TRANSACTIONS OFF;
SELECT TOP 1 ProductName, ProductPrice FROM Products;
SELECT @@TRANCOUNT AS TransactionCount;

परिणाम:

+--------------------+
| TransactionCount   |
|--------------------|
| 0                  |
+--------------------+
(1 row affected)
Commands completed successfully.
+-------------------------+----------------+
| ProductName             | ProductPrice   |
|-------------------------+----------------|
| Left handed screwdriver | 25.99          |
+-------------------------+----------------+
(1 row affected)
+--------------------+
| TransactionCount   |
|--------------------|
| 0                  |
+--------------------+
(1 row affected)

इस मामले में, मैंने IMPLICIT_TRANSACTIONS . सेट किया है करने के लिए OFF और SELECT चलाएँ बयान। इसका मतलब था कि SELECT स्टेटमेंट ऑटोकॉमिट मोड में चला, और इसलिए, लेन-देन शुरू हो गया और निहित रूप से समाप्त हो गया।

@@TRANCOUNT लौटा 0 , जिसका अर्थ है कि उस समय कोई लेन-देन नहीं चल रहा था।

यह फिर से है, इस समय को छोड़कर हम IMPLICIT_TRANSACTIONS सेट करते हैं करने के लिए ON

SELECT @@TRANCOUNT AS TransactionCount;
SET IMPLICIT_TRANSACTIONS ON;
SELECT TOP 1 ProductName, ProductPrice FROM Products;
SELECT @@TRANCOUNT AS TransactionCount;

परिणाम:

+--------------------+
| TransactionCount   |
|--------------------|
| 0                  |
+--------------------+
(1 row affected)
Commands completed successfully.
+-------------------------+----------------+
| ProductName             | ProductPrice   |
|-------------------------+----------------|
| Left handed screwdriver | 25.99          |
+-------------------------+----------------+
(1 row affected)
+--------------------+
| TransactionCount   |
|--------------------|
| 1                  |
+--------------------+
(1 row affected)

अंतिम @@TRANCOUNT 1 . का मान लौटा रहा है . इसका मतलब है कि हमारा लेनदेन अभी भी प्रगति पर है।

@@TRANCOUNT BEGIN TRANSACTION . की संख्या लौटाता है बयान जो वर्तमान कनेक्शन पर हुआ है। हमने स्पष्ट रूप से एक जारी नहीं किया था, लेकिन एक को अस्पष्ट रूप से जारी किया गया था।

इसलिए @@TRANCOUNT को कम करने के लिए हमें वास्तव में यह लेन-देन करने (या इसे वापस रोल करने) की आवश्यकता है 0 . तक नीचे ।

COMMIT TRANSACTION;
SELECT @@TRANCOUNT AS TransactionCount;

परिणाम:

+--------------------+
| TransactionCount   |
|--------------------|
| 0                  |
+--------------------+
(1 row affected)

तो हमारे निहित लेनदेन के कोड में COMMIT . शामिल होना चाहिए था कथन:

SELECT @@TRANCOUNT AS TransactionCount;
SET IMPLICIT_TRANSACTIONS ON;
SELECT TOP 1 ProductName, ProductPrice FROM Products;
COMMIT TRANSACTION;
SELECT @@TRANCOUNT AS TransactionCount;

परिणाम:

+--------------------+
| TransactionCount   |
|--------------------|
| 0                  |
+--------------------+
(1 row affected)
Commands completed successfully.
+-------------------------+----------------+
| ProductName             | ProductPrice   |
|-------------------------+----------------|
| Left handed screwdriver | 25.99          |
+-------------------------+----------------+
(1 row affected)
Commands completed successfully.
+--------------------+
| TransactionCount   |
|--------------------|
| 0                  |
+--------------------+
(1 row affected)

ANSI_DEFAULTS

यदि आप पाते हैं कि निहित लेनदेन अनपेक्षित रूप से सक्षम हैं, तो यह ANSI_DEFAULTS के कारण हो सकता है सेटिंग।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर * =ऑपरेटर?

  2. T-SQL का उपयोग करके SQL सर्वर एजेंट XP को कैसे सक्षम करें

  3. एसक्यूएल सर्वर मॉनिटरिंग के साथ अलर्ट ओवरलोड को रोकने में मदद करने के 4 तरीके

  4. बीसीपी उपयोगिता और एसक्यूएल सर्वर 2008 का उपयोग करके कॉलम हेडर (कॉलम नाम) के साथ फाइल करने के लिए निर्यात तालिका

  5. SQL सर्वर में एक प्रारूप स्ट्रिंग क्या है?