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
के कारण हो सकता है सेटिंग।