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

रेल एक (छद्म) नेस्टेड लेनदेन में रोलबैक को अनदेखा क्यों करता है?

वास्तव में नेस्टेड लेनदेन . ऐसा ही होता है के लिए डिजाइन किया गया था। मैं ओरेकल डॉक्स से उद्धृत करता हूं:

तो, एक नियमित नेस्टेड लेन-देन . में एक चाइल्ड लेन-देन उसे या अन्य बच्चों या माता-पिता (बड़ा लेन-देन . के बारे में कोई बात नहीं है ) आपसी डेटा बदलने या अपवाद के लिए विफल होने के अलावा अन्य व्यवहार कर सकता है।

लेकिन आप उसे अनुदान दे सकते हैं (बाल लेन-देन ) sub-transaction . का उपयोग करके अपने भाग्य पर मतदान का एक बहुत ही सीमित मौका रेल में बताई गई सुविधा docs requires_new: true . पास करके

User.transaction do
  User.create(username: 'Kotori')
  User.transaction(requires_new: true) do
    User.create(username: 'Nemu')
    raise ActiveRecord::Rollback
  end
end

जैसा कि डॉक्स कहते हैं:केवल 'कोटरी' बनाता है। चूंकि शक्तिशाली 'नेमू' बच्चे ने चुपचाप मरने का फैसला किया।

नेस्टेड लेनदेन नियमों . के बारे में अधिक विवरण (ओरेकल डॉक्स )

अपडेट करें:

बेहतर ढंग से समझने के लिए क्यों रेल nested transactions इस तरह से काम करता है, आपको डीबी स्तर में नेस्टेड लेनदेन कैसे काम करता है, इसके बारे में आपको कुछ और जानने की जरूरत है, मैं रेल एपीआई डॉक्स :

ठीक है, फिर डॉक्स nested transaction . के व्यवहार का वर्णन करते हैं दो उल्लिखित मामलों में निम्नानुसार है:

नेस्टेड कॉल के मामले में, #transaction इस प्रकार व्यवहार करेगा:

  • बिना कुछ किए ही ब्लॉक चलाया जाएगा। ब्लॉक के भीतर होने वाले सभी डेटाबेस स्टेटमेंट पहले से ही खुले डेटाबेस लेनदेन में प्रभावी रूप से जुड़ जाते हैं।

  • हालांकि, अगर :require_new सेट किया गया है, तो ब्लॉक एक डेटाबेस सेवपॉइंट में लपेटा जाएगा जो उप-लेनदेन के रूप में कार्य करेगा।

मैं कल्पना करता हूं सावधान, केवल कल्पना करें वह:

विकल्प(1) (बिना आवश्यकता_नया) क्या आपने एक ऐसे DBMS का उपयोग किया है जो nested transactions का पूरी तरह से समर्थन करता है या आप nested_attributes . के "नकली" व्यवहार से खुश हैं

जबकि विकल्प(2) savepoint . का समर्थन करना है यदि आप नहीं करते हैं तो समाधान।



  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. अद्यतन चर के लिए MYSQL संग्रहीत कार्यविधि 0 . हैं

  3. PHP/MySQL एप्लिकेशन के लिए माइग्रेशन (स्कीमा और डेटा) को स्वचालित कैसे करें

  4. इन्सर्ट का उपयोग करके MySQL पर टेक्स्ट पोस्ट करने में असमर्थ

  5. पीडीओ डिबगिंग - बाइंड के बाद क्वेरी देखें?