लेन-देन का उपयोग नहीं करने के लिए और एक का अनुकरण करने के लिए एक वर्कअराउंड का उपयोग करने के लिए कहा


43

मैं कई वर्षों से टी-एसक्यूएल का विकास कर रहा हूं और हमेशा आगे खुदाई कर रहा हूं, भाषा के सभी पहलुओं के बारे में जानने के लिए सभी को सीखना जारी रखूंगा। मैंने हाल ही में एक नई कंपनी में काम करना शुरू किया है और मुझे लगता है कि लेन-देन के बारे में एक अजीब सुझाव है। कभी उनका उपयोग न करें। इसके बजाय, एक लेनदेन का अनुकरण करने वाले वर्कअराउंड का उपयोग करें। यह हमारे डीबीए से आ रहा है जो एक डेटाबेस में बहुत सारे लेनदेन के साथ काम करता है और बाद में, बहुत से अवरोधक। मैं जिस डेटाबेस में मुख्य रूप से काम करता हूं वह इस समस्या से ग्रस्त नहीं है और मुझे लगता है कि लेनदेन का उपयोग अतीत में किया गया है।

मैं समझता हूं कि ऐसा करना लेनदेन के साथ अवरुद्ध करना अपेक्षित है क्योंकि ऐसा करना उनकी प्रकृति में है और यदि आप किसी एक का उपयोग किए बिना इसे दूर कर सकते हैं, तो हर तरह से ऐसा करें। लेकिन मेरे पास कई अवसर हैं जहां प्रत्येक कथन को सफलतापूर्वक निष्पादित करना होगा। यदि कोई विफल हो जाता है तो वे सब करने में विफल होना चाहिए।

मैंने हमेशा अपने लेन-देन के दायरे को यथासंभव कम रखा है, हमेशा SET XACT_ABORT ON और हमेशा TRY / CATCH के संयोजन में उपयोग किया जाता है।

उदाहरण:

CREATE SCHEMA someschema;
GO


CREATE TABLE someschema.tableA
(id   INT NOT NULL IDENTITY(1, 1) PRIMARY KEY, 
 ColA VARCHAR(10) NOT NULL
);
GO

CREATE TABLE someschema.tableB
(id   INT NOT NULL IDENTITY(1, 1) PRIMARY KEY, 
 ColB VARCHAR(10) NOT NULL
); 
GO


CREATE PROCEDURE someschema.ProcedureName @ColA VARCHAR(10), 
                                          @ColB VARCHAR(10)
AS
SET NOCOUNT, XACT_ABORT ON;
BEGIN
BEGIN TRY
    BEGIN TRANSACTION;

    INSERT INTO someschema.tableA(ColA)
    VALUES(@ColA);

    INSERT INTO someschema.tableB(ColB)
    VALUES(@ColB);

--Implement error
    SELECT 1/0 

    COMMIT TRANSACTION;
END TRY
BEGIN CATCH
    IF @@trancount > 0
    BEGIN
        ROLLBACK TRANSACTION;
    END;
    THROW;
    RETURN;
END CATCH;
END;
GO

यहाँ उन्होंने सुझाव दिया है कि मैं करता हूँ।

GO



CREATE PROCEDURE someschema.ProcedureNameNoTransaction @ColA VARCHAR(10), 
                                                       @ColB VARCHAR(10)
AS
SET NOCOUNT ON;
BEGIN
BEGIN TRY
    DECLARE @tableAid INT;
    DECLARE @tableBid INT;

    INSERT INTO someschema.tableA(ColA)
    VALUES(@ColA);
    SET @tableAid = SCOPE_IDENTITY();

    INSERT INTO someschema.tableB(ColB)
    VALUES(@ColB);
    SET @tableBid = SCOPE_IDENTITY();

--Implement error
    SELECT 1/0 

END TRY
BEGIN CATCH
    DELETE FROM someschema.tableA
    WHERE id = @tableAid;

    DELETE FROM someschema.tableB
    WHERE id = @tableBid;

    THROW;

    RETURN;
END CATCH;
END;
GO

समुदाय के लिए मेरा प्रश्न इस प्रकार है। क्या यह लेन-देन के लिए एक व्यवहार्य समाधान के रूप में समझ में आता है?

लेन-देन के बारे में मुझे जो पता है और समाधान का प्रस्ताव है उससे मेरी राय यह है कि नहीं, यह एक व्यवहार्य समाधान नहीं है और विफलता के कई बिंदुओं का परिचय देता है।

सुझाए गए वर्कअराउंड में, मुझे चार निहित लेनदेन दिखाई दे रहे हैं। कोशिश में दो आवेषण और फिर पकड़ने में विलोप के लिए दो और लेनदेन। यह आवेषण को "पूर्ववत" करता है, लेकिन कुछ भी वापस किए बिना कुछ भी नहीं वास्तव में वापस लुढ़का हुआ है।

यह उनके द्वारा सुझाई गई अवधारणा को प्रदर्शित करने के लिए एक बहुत ही बुनियादी उदाहरण है। कुछ वास्तविक संग्रहित प्रक्रियाएँ जो मैं कर रहा हूँ, उन्हें पूरी तरह से लंबे समय तक करना और प्रबंधित करना मुश्किल है क्योंकि "रोलिंग बैक" कई परिणाम बनाम दो पैरामीटर मान इस उदाहरण में काफी जटिल हो जाते हैं जैसा कि आप कल्पना कर सकते हैं। चूंकि "रोलिंग बैक" अब मैन्युअल रूप से किया जा रहा है, इसलिए वास्तविक के कारण कुछ मिस करने का अवसर।

एक और मुद्दा जो मुझे लगता है कि मौजूद है, टाइमआउट या अलग किए गए कनेक्शन के लिए है। क्या यह अभी भी लुढ़का हुआ है? यह मेरी समझ है कि क्यों सेट XACT_ABORT ON का उपयोग किया जाना चाहिए ताकि इन मामलों में, लेन-देन वापस हो जाए।

अग्रिम में आपकी प्रतिक्रिया के लिए धन्यवाद!


4
टिप्पणियां जो उनके घोषित उद्देश्य की सेवा नहीं करती हैं, हटा दी गई हैं, या सामुदायिक विकी उत्तर में स्थानांतरित कर दी गई हैं।
पॉल व्हाइट

जवाबों:


61

आप नहीं कर सकते नहीं एसक्यूएल सर्वर (और शायद किसी अन्य उचित RDBMS) में लेनदेन का उपयोग करें। स्पष्ट लेन-देन सीमाओं ( begin transaction... commit) की अनुपस्थिति में, प्रत्येक एसक्यूएल स्टेटमेंट एक नया लेनदेन शुरू करता है, जो कि स्टेटमेंट पूरा होने के बाद (या लुढ़का हुआ) निहित होता है।

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

  • परमाणु: असफलता। यदि आपके छद्म लेनदेन के बीच में "हार्ड" त्रुटि कहीं होती है, तो परिवर्तन गैर-परमाणु होगा।

  • संगति: असफल। यह ऊपर से इस प्रकार है कि आपका डेटा "हार्ड" त्रुटि के बाद असंगत स्थिति में होगा।

  • अलगाव: असफल। यह संभव है कि एक समवर्ती छद्म लेनदेन आपके पूर्ण होने से पहले आपके छद्म लेनदेन द्वारा संशोधित कुछ डेटा को बदल देता है।

  • स्थायित्व: सफलता। किए जाने वाले परिवर्तन होगा टिकाऊ होना, डेटाबेस सर्वर है कि यह सुनिश्चित करेंगे; यह केवल एक चीज है जिससे आपके सहयोगी का दृष्टिकोण खराब नहीं हो सकता।

सभी प्रकार के या RDBMSes में लेनदेन की ACIDity सुनिश्चित करने के लिए ताले एक व्यापक रूप से इस्तेमाल और अनुभवजन्य सफल विधि है (यह साइट एक उदाहरण है)। मुझे यह बहुत संभावना नहीं है कि एक यादृच्छिक डीबीए सैकड़ों की तुलना में संगामिति समस्या के बेहतर समाधान के साथ आ सकता है, संभवतः हजारों कंप्यूटर वैज्ञानिक और इंजीनियर जो पिछले कुछ समय से कुछ दिलचस्प डेटाबेस सिस्टम बना रहे हैं, क्या, 50? 60 साल? (मुझे लगता है कि यह "प्राधिकरण के लिए अपील" तर्क के रूप में कुछ हद तक निराशाजनक है, लेकिन मैं इसकी परवाह किए बिना रहूंगा।)

अंत में, यदि आप कर सकते हैं तो अपनी "डीबीए" की सलाह को अनदेखा करें, यदि आपके पास आत्मा है, तो उससे लड़ें और यदि वे उत्पन्न होते हैं तो विशिष्ट संगामिती समस्याओं के साथ यहां वापस आएं।


14

कुछ त्रुटियां हैं जो इतनी गंभीर हैं कि CATCH ब्लॉक कभी दर्ज नहीं किया जाता है। से प्रलेखन

ऐसी त्रुटियां जिनमें 20 या उससे अधिक की गंभीरता है जो सत्र के लिए SQL सर्वर डेटाबेस इंजन कार्य प्रक्रिया को रोकते हैं। यदि कोई त्रुटि होती है जिसमें 20 या उच्चतर की गंभीरता होती है और डेटाबेस कनेक्शन बाधित नहीं होता है, तो TRY ... CATCH त्रुटि को संभाल लेगा।

ग्राहक-रुकावट के अनुरोध या टूटे हुए ग्राहक कनेक्शन जैसे संकेत।

जब KILL कथन का उपयोग करके सिस्टम व्यवस्थापक द्वारा सत्र समाप्त हो जाता है।

...

संकलित त्रुटियां, जैसे वाक्यविन्यास त्रुटियां, जो बैच को चलने से रोकती हैं।

त्रुटियां जो होती हैं ... आस्थगित नाम संकल्प के कारण।

इनमें से बहुत से गतिशील SQL के माध्यम से उत्पादन करना आसान है। आपके द्वारा दिखाए गए जैसे पूर्व कथन आपके डेटा को ऐसी त्रुटियों से नहीं बचाएंगे।


2
सही - और यदि और कुछ नहीं, तो कोड को निष्पादित करते समय मरने वाला ग्राहक "इतनी गंभीर कि CATCH ब्लॉक कभी नहीं" एक त्रुटि का गठन करेगा। कोई फर्क नहीं पड़ता कि आप सॉफ्टवेयर पर कितना भरोसा करते हैं (न केवल आपके अपने कोड, बल्कि सभी सॉफ्टवेयर स्टैक्स में से एक हिस्सा), वहाँ हमेशा एक हार्डवेयर की विफलता की संभावना है (फिर, संभवतः श्रृंखला के साथ कहीं भी) आपको किसी भी समय ठंडा होने से रोकता है। । इस तरह की "वर्कअराउंड" की ओर ले जाने वाली सोच के खिलाफ एक अच्छा बचाव है।
dgould

2
इसके अलावा, आप एक गतिरोध का शिकार हो सकते हैं। यदि आप डेटाबेस में लिखने का प्रयास करते हैं तो आपका CATCH ब्लॉक चलता है लेकिन फेंक देते हैं।
जोशुआ

10

i-एक : आपके द्वारा सुझाया गया समाधान ACID के "ए" का उल्लंघन (कम से कम) संभव बनाता है। उदाहरण के लिए, यदि SP को दूरस्थ क्लाइंट द्वारा निष्पादित किया जा रहा है और कनेक्शन टूट जाता है, तो आंशिक "कमिट" / "रोलबैक" हो सकता है, क्योंकि सर्वरदो सम्मिलन / विलोपन के बीच सत्रको समाप्त कर सकता है(और इसके अंत तक पहुंचने से पहले SP निष्पादन समाप्त कर सकता है) ।

क्या यह लेन-देन के लिए एक व्यवहार्य समाधान के रूप में समझ में आता है?

dan-guzman : नहीं,CATCHब्लॉक कभी भी क्वेरी टाइमआउट के मामले में निष्पादित नहीं होता है क्योंकि क्लाइंट API ने बैच को रद्द कर दिया है। लेन-देन के बिना,SET XACT_ABORT ONवर्तमान विवरण के अलावा और कुछ भी रोलबैक नहीं किया जा सकता है।

tibor-karaszi : आपके पास 4 लेन-देन हैं, जिसका अर्थ है कि लेन-देन लॉग फ़ाइल में अधिक लॉगिंग। याद रखें कि प्रत्येक लेनदेन के लिए उस बिंदु तक लॉग रिकॉर्ड के एक तुल्यकालिक लेखन की आवश्यकता होती है यानी आपको कई लेनदेन का उपयोग करते समय उस पहलू से भी बदतर प्रदर्शन मिलता है।

rbarryyoung : यदि उन्हें बहुत अधिक अवरोध हो रहा है, तो उन्हें या तो अपने डेटा डिज़ाइन को ठीक करना होगा, अपने टेबल एक्सेस ऑर्डर को तर्कसंगत बनाना होगा या अधिक उपयुक्त आइसोलेशन स्तर का उपयोग करना होगा। वे मान रहे हैं कि उनकी समस्याएं (और इसे समझने में विफलता) आपकी समस्या बन जाएगी। लाखों अन्य डेटाबेस से सबूत है कि यह नहीं होगा।

इसके अलावा, जो वे मैन्युअल रूप से लागू करने की कोशिश कर रहे हैं वह प्रभावी रूप से एक गरीब-आदमी आशावादी संगामिति है। इसके बजाय उन्हें क्या करना चाहिए, जो पहले से SQL सर्वर में निर्मित दुनिया के कुछ सर्वश्रेष्ठ आशावादी संगामिति का उपयोग करने के लिए है। यह ऊपर अलगाव बिंदु पर जाता है। सभी संभावना में वे जो कुछ भी निराशावादी संगोष्ठी अलगाव स्तर से स्विच करने की आवश्यकता है, वे वर्तमान में आशावादी संगोष्ठी अलगाव स्तर में से एक का उपयोग कर रहे हैं, SNAPSHOTया READ_COMMITTED_SNAPSHOT। ये प्रभावी रूप से अपने मैनुअल कोड के समान काम करेंगे, सिवाय इसके कि यह सही ढंग से करेगा।

ross-presser : यदि आपके पास बहुत लंबी चलने वाली प्रक्रियाएं हैं - जैसे कि आज कुछ होता है और अगले हफ्ते कुछ का पालन करना होता है, और अगर अगले हफ्ते की बात विफल हो जाती है, तो आज का दिन असफल होना चाहिए - आप साग में देखना चाहते हैं । कड़ाई से यह बोलना डेटाबेस के बाहर है, क्योंकि इसके लिए एक सेवा बस की आवश्यकता होती है।


5

बुरा विचार कोड लाइन को ठीक करने के लिए अधिक महंगा होने जा रहा है।

यदि स्पष्ट लेन-देन (रोलबैक / कमिट) का उपयोग करते हुए अवरुद्ध समस्याएं हैं, तो मुद्दों को संबोधित करने के लिए कुछ महान विचारों के लिए इंटरनेट पर अपना डीबीए इंगित करें।

यहाँ अवरुद्ध को कम करने में मदद करने का एक तरीका है: https://www.sqlservercentral.com/articles/use-indexes-to-reduce-blocking-in-concurrent-transactions

सूचकांक पंक्तियों की एक पंक्ति / सेट को खोजने के लिए तालिका / पृष्ठ में होने वाले सीकों की संख्या को कम करते हैं। उन्हें आम तौर पर SELECT * क्वेरीज़ के लिए निष्पादन के समय को कम करने के लिए और सही तरीके से भी देखा जाता है। उन्हें बड़ी संख्या में UPDATES में शामिल तालिकाओं के लिए उपयुक्त नहीं माना जाता है। वास्तव में INDEXES इन मामलों में प्रतिकूल पाए जाते हैं क्योंकि वे UPDATE प्रश्नों को पूरा करने में लगने वाले समय को बढ़ा देते हैं।

पर यह मामला हमेशा नहीं होता। UPDATE स्टेटमेंट के निष्पादन में थोड़ा गहराई से देखने पर हमें पता चलता है कि इसमें पहले सेलेक्ट स्टेटमेंट निष्पादित करना भी शामिल है। यह एक विशेष और अक्सर देखा जाने वाला परिदृश्य है जहाँ क्वेरीज़ पंक्तियों के परस्पर अनन्य सेट को अद्यतन करती हैं। INDEXES यहां लोकप्रिय विश्वास के विपरीत डेटाबेस इंजन के प्रदर्शन में उल्लेखनीय वृद्धि कर सकता है।


4

नकली लेनदेन की रणनीति खतरनाक है क्योंकि यह निर्णायक मुद्दों को अनुमति देता है जो लेनदेन विशेष रूप से रोकते हैं। इस बात पर विचार करें कि दूसरे उदाहरण में कथनों के बीच कोई डेटा बदला जा सकता है।

नकली लेनदेन को हटाने या सफल होने के लिए गारंटी नहीं है। यदि नकली लेनदेन के दौरान डेटाबेस सर्वर बंद हो जाता है, तो कुछ नहीं बल्कि सभी प्रभाव बने रहेंगे। लेन-देन रोलबैक है कहने के तरीके में सफल होने के लिए भी उन्हें गारंटी नहीं है।

यह रणनीति आवेषण के साथ काम कर सकती है, लेकिन निश्चित रूप से अपडेट या डिलीट (कोई टाइम-मशीन SQL स्टेटमेंट) के साथ काम नहीं करेगी।

यदि सख्त लेन-देन की संगरोधता अवरुद्ध हो रही है, तो बहुत सारे समाधान हैं, यहां तक ​​कि सुरक्षा स्तर को कम करने वाले भी ... ये समस्या को हल करने का सही तरीका है।

आपका डीबीए एक ऐसा समाधान पेश कर रहा है जो डेटाबेस के केवल एक उपयोगकर्ता होने पर ठीक काम कर सकता है, लेकिन किसी भी तरह के गंभीर उपयोग के लिए बिल्कुल अयोग्य है।


4

यह एक प्रोग्रामिंग मुद्दा नहीं है, बल्कि यह एक पारस्परिक / गलत संचार मुद्दा है। सबसे अधिक संभावना है कि आपका "डीबीए" ताले के बारे में चिंतित है, लेनदेन नहीं।

अन्य उत्तर पहले से ही समझाते हैं कि आपको लेन-देन का उपयोग क्यों करना है ... मेरा मतलब है कि आरडीबीएमएस क्या करता है, बिना ठीक से उपयोग किए गए लेनदेन के बिना कोई डेटा अखंडता नहीं है, इसलिए मैं इस बात पर ध्यान केंद्रित करूंगा कि वास्तविक समस्या को कैसे हल किया जाए: आपके "डीबीए" ने लेनदेन के लिए एक एलर्जी विकसित की और उसे अपना मन बदलने के लिए मना लिया।

मुझे लगता है कि यह आदमी "एक विशेष परिदृश्य जहां बुरा कोड" भयानक प्रदर्शन के परिणामस्वरूप "सभी लेनदेन खराब हैं" भ्रामक है। मैं उस गलती को करने के लिए एक सक्षम डीबीए की उम्मीद नहीं करूंगा, इसलिए यह वास्तव में अजीब है। शायद उसे कुछ भयानक कोड के साथ वास्तव में बुरा अनुभव था?

इस तरह एक परिदृश्य पर विचार करें:

BEGIN
UPDATE or DELETE some row, which takes locks it
...do something that takes a while
...perform other queries
COMMIT

लेन-देन के उपयोग की यह शैली एक ताला (या कई ताले) रखती है जिसका अर्थ है कि समान पंक्तियों को मारते हुए अन्य लेनदेन को इंतजार करना होगा। यदि ताले लंबे समय तक आयोजित किए जाते हैं, और विशेष रूप से यदि बहुत सारे अन्य लेनदेन समान पंक्तियों को लॉक करना चाहते हैं, तो यह वास्तव में प्रदर्शन को नुकसान पहुंचा सकता है।

आप उससे क्या पूछ सकते हैं कि उसे लेन-देन का उपयोग न करने का यह गलत गलत विचार क्यों है, किस प्रकार के प्रश्न समस्याग्रस्त थे, आदि। फिर उसे मनाने की कोशिश करें कि आप निश्चित रूप से ऐसे ही बुरे परिदृश्यों से बचेंगे, जिससे आप अपने लॉक उपयोग की निगरानी करेंगे और प्रदर्शन, उसे आश्वस्त करना, आदि।

वह आपको बता रहा है "पेचकश को मत छुओ!" इसलिए आपके द्वारा अपने प्रश्न में पोस्ट किया गया कोड मूल रूप से एक स्क्रू ड्राइव करने के लिए एक हथौड़ा का उपयोग कर रहा है। बहुत बेहतर विकल्प है कि आप उसे समझाएं कि कैसे एक पेचकश का उपयोग करें ...

मैं कई उदाहरणों के बारे में सोच सकता हूं ... ठीक है, वे MySQL पर थे लेकिन यह भी काम करना चाहिए।

एक मंच था जहां पूर्ण पाठ सूचकांक को अद्यतन करने में कुछ समय लगा। जब कोई उपयोगकर्ता एक पोस्ट सबमिट करता है, तो लेन-देन पोस्ट संख्या और अंतिम पोस्ट दिनांक (इस प्रकार विषय पंक्ति को लॉक करने) को बढ़ाने के लिए विषय तालिका को अपडेट करेगा, फिर पोस्ट डाला जाएगा, और लेन-देन तब तक लॉक रहेगा जब तक पूर्णांक सूचकांक अपडेट नहीं हो जाता और COMMIT किया गया था।

चूंकि यह बहुत कम रैम के साथ रस्टबकेट पर चलता है, इसलिए कहा जाता है कि फुलटेक्स इंडेक्स अक्सर बॉक्स में सिंगल स्लो स्पिनिंग ड्राइव पर कई सेकंड के गहन यादृच्छिक आईओ का परिणाम होता है।

समस्या यह थी कि विषय पर क्लिक करने वाले लोगों ने विषय पर दृश्य गणना बढ़ाने के लिए एक क्वेरी का कारण बना, जिसके लिए विषय पंक्ति पर ताला भी आवश्यक था। इस प्रकार, कोई भी इस विषय को नहीं देख सकता था, जबकि इसका पूर्ण सूचकांक सूचकांक अपडेट हो रहा था। मेरा मतलब है, पंक्ति को पढ़ा जा सकता है, लेकिन इसे अपडेट करने से लॉक हो जाएगा।

इससे भी बदतर, पोस्टिंग पेरेंट फ़ोरम टेबल पर पोस्ट काउंट को अपडेट करती है और लॉक भी रखती है जबकि फुलटेक्स इंडेक्स अपडेट हो रहा था ... जिसने कुछ सेकंड के लिए पूरे फ़ोरम को फ्रीज़ कर दिया और वेब सर्वर कतार में ढेर सारे अनुरोध करने लगे। ।

समाधान ताले को सही क्रम में ले जाना था: BEGIN, पोस्ट डालें और किसी भी ताले को लिए बिना फुलटेक्स्ट इंडेक्स को अपडेट करें, फिर पोस्ट काउंट और लास्ट पोस्ट डेट, और COMMIT के साथ विषय / फोरम पंक्तियों को जल्दी से अपडेट करें। इससे समस्या पूरी तरह से हल हो गई। यह सिर्फ कुछ प्रश्नों के आसपास घूम रहा था, वास्तव में सरल था।

इस मामले में, लेन-देन समस्या नहीं थे ... यह एक लंबे ऑपरेशन से पहले एक अनावश्यक ताला प्राप्त कर रहा था। लेन-देन में ताला लगाते समय बचने के लिए सामान के अन्य उदाहरण: उपयोगकर्ता इनपुट की प्रतीक्षा में, धीमी कताई ड्राइव, नेटवर्क IO, आदि से बहुत सारे अनछुए डेटा तक पहुंचना।

बेशक, कभी-कभी, आपके पास कोई विकल्प नहीं होता है और आपको बोझिल तालों को पकड़ते हुए लंबी प्रक्रिया करनी होती है। इसके चारों ओर ट्रिक्स हैं (डेटा की एक प्रति पर काम करते हैं, आदि) लेकिन काफी बार प्रदर्शन में अड़चन एक लॉक से आती है जिसे जानबूझकर हासिल नहीं किया गया था, और बस प्रश्नों को फिर से हल करना समस्या का हल करता है। इससे भी बेहतर, प्रश्नों को लिखते समय लिए गए तालों के बारे में पता किया जा रहा है ...

मैं अन्य उत्तर नहीं दूंगा लेकिन वास्तव में ... लेन-देन का उपयोग करें। आपकी समस्या आपके "डीबीए" को आश्वस्त कर रही है, डेटाबेस की सबसे महत्वपूर्ण विशेषता के आसपास काम नहीं कर रही है ...


3

TLDR: उचित अलगाव स्तर का उपयोग करें ।

जैसा कि आपने सही ढंग से लेनदेन के बिना दृष्टिकोण पर ध्यान दिया और "मैनुअल" वसूली के साथ बहुत जटिल हो सकता है। उच्च जटिलता का अर्थ है सामान्य रूप से इसे लागू करने के लिए अधिक समय और त्रुटियों को ठीक करने के लिए बहुत अधिक समय (क्योंकि जटिलता कार्यान्वयन में अधिक त्रुटियों की ओर जाता है)। इसका मतलब है कि इस तरह के दृष्टिकोण से आपके ग्राहक को बहुत अधिक लागत आ सकती है।

आपके "डीबीए" सहयोगी की मुख्य चिंता प्रदर्शन है। इसे सुधारने का एक तरीका उचित अलगाव स्तर का उपयोग करना है। मान लीजिए कि आपके पास एक ऐसी प्रक्रिया है जो उपयोगकर्ता को कुछ तरह का ओ अवलोकन डेटा प्रदान करती है। इस तरह की प्रक्रिया को जरूरी नहीं कि SERIALIZABLE अलगाव स्तर का उपयोग किया जाए। कई मामलों में READ UNCOMMITTED काफी पर्याप्त हो सकता है। इसका मतलब है, इस तरह की प्रक्रिया आपके लेन-देन को अवरुद्ध नहीं करेगी जो कुछ डेटा बनाती या संशोधित करती है।

मेरा सुझाव है कि आप अपने डेटाबेस में सभी मौजूदा कार्यों / प्रक्रियाओं की समीक्षा करें, प्रत्येक के लिए उचित अलगाव स्तर का मूल्यांकन करें, अपने ग्राहक को प्रदर्शन के लाभ बताएं। फिर इन कार्यों / प्रक्रियाओं को तदनुसार समायोजित करें।


2

आप इन-मेमोरी ओएलटीपी टेबल का उपयोग करने का निर्णय भी ले सकते हैं। वे बेशक अभी भी लेनदेन का उपयोग करते हैं, लेकिन इसमें कोई अवरोध शामिल नहीं है।
के बजाय सभी कार्यों को अवरुद्ध करने में सफल होंगे, लेकिन प्रतिबद्ध चरण के दौरान इंजन लेनदेन के टकराव की जांच करेगा और एक कमिट विफल हो सकता है। Microsoft "आशावादी लॉकिंग" शब्द का उपयोग करता है।
यदि स्केलिंग समस्या दो राइट ऑपरेशन के बीच टकराव के कारण होती है, जैसे कि दो समवर्ती लेनदेन एक ही पंक्ति को अपडेट करने की कोशिश करते हैं, तो इन-मेमोरी ओएलटीपी एक लेनदेन को सफल होने देता है और दूसरे लेनदेन को विफल करता है। विफल लेन-देन को फिर से या स्पष्ट रूप से निहित रूप से प्रस्तुत किया जाना चाहिए, लेन-देन को फिर से प्रयास करना चाहिए।
अधिक पर: स्मृति OLTP में


-5

लेन-देन का उपयोग सीमित सीमा तक करने का एक तरीका है और वह है अपने डेटा मॉडल को बदलकर अधिक वस्तु उन्मुख होना। इसलिए उदाहरण के लिए कई तालिकाओं में किसी व्यक्ति के बारे में जनसांख्यिकीय डेटा संग्रहीत करने और उन्हें एक-दूसरे से संबंधित करने और लेनदेन की आवश्यकता के बजाय, आपके पास एक एकल JSON दस्तावेज़ हो सकता है जो उस व्यक्ति के बारे में जानने के लिए एक ही क्षेत्र में सब कुछ संग्रहीत करता है। बेशक दूर तक काम कर रहा है कि डोमेन स्ट्रेच एक और डिज़ाइन चुनौती है, जो डेवलपर्स द्वारा डीबीए नहीं किया गया है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.