2010-11-01 8 views
7

थोड़ी देर के लिए इस पर मेरे सिर खरोंच गया ....पीडीओ :: ATTR_AUTOCOMMIT पर ध्यान नहीं देता गैर लेन-देन सम्मिलित/अपडेट

मैं pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,0); के साथ एक पीडीओ वस्तु है के रूप में मैं कुछ InnoDB तालिकाओं के साथ FOR UPDATE उपयोग करना चाहते हैं। MySQL प्रलेखन पढ़ना, FOR UPDATE केवल पढ़ने पंक्तियों ताला अगर होगा:

  1. आप एक सौदे में हैं
  2. आप नहीं हैं किसी लेनदेन में और set autocommit=0 जारी किया गया है

तो, मैं कर रहा हूँ पीडीओ ऑब्जेक्ट को पंक्तियों को लॉक करने की अनुमति देने के लिए ATTR_AUTOCOMMIT का उपयोग करना। किसी भी मामले में, यह लागू करने के लिए INSERT और अद्यतन विवरण का कारण बन रहा है। ये बयान FOR UPDATE के साथ कुछ भी करने के लिए नहीं हैं, वे तैयार बयान के साथ एक ही पीडीओ ऑब्जेक्ट के माध्यम से चल रहे हैं।

xxx Connect [email protected] 
xxx Query  set autocommit=0 
xxx Query  INSERT INTO foo_tbl (bar, baz) VALUES ('hello','world') 
xxx Quit 

PHP/पीडीओ शिकायत नहीं है, लेकिन तालिका से चयन पता चलता है कि डेटा लिखा नहीं किया गया है:

मेरे MySQL क्वेरी लॉग तरह दिखता है।

जो प्रश्न मैं चला रहा हूं वह हजारों बार पहले चला गया है; केवल ATTR_AUTOCOMMIT परिवर्तन किया गया है। उस विकल्प को हटाने से सब कुछ फिर से काम करता है। autocommit=0 विकल्प के साथ लेनदेन ठीक काम कर रहे हैं।

क्या पीडीओ ऑब्जेक्ट (commit() पर सही कॉल करने की आवश्यकता है अतिरिक्त परिवर्तन हैं कि यह लेनदेन में नहीं है) परिवर्तनों को छूने के लिए? असल में, मैं एक सादा पीडीओ ऑब्जेक्ट चाहता हूं लेकिन इनो डीबी टेबल के लिए लेनदेन के बाहर पंक्तियों को लॉक करने के विकल्प के साथ (पृष्ठभूमि के लिए बहुत लंबा और उबाऊ क्यों है)।

मुझे यकीन है कि यह कुछ बेवकूफ मैं खरोंच याद आ रही है सिर

+0

चिंता न करें, हम सभी कभी-कभी चीजों को याद करते हैं! मुझे पता है कि यह मेरे साथ बहुत अधिक होता है मैं स्वीकार करना चाहता हूं :-) – Josh

उत्तर

6
$db = new PDO('mysql:dbname=test'); 
    $db->setAttribute(PDO::ATTR_AUTOCOMMIT,0); 
    var_dump($db->query('SELECT @@autocommit')->fetchAll()); //OK 
    $db->query("INSERT INTO foo (bar) VALUES ('a');"); 
    $db->query("COMMIT;");//do by SQL rather then by interface/PDO-method 

लेकिन अनिवार्य रूप से, आप एक सौदे में हैं (आप बस पीडीओ के साथ इसे शुरू नहीं किया है), एक रोलबैक आदि अभी भी उपलब्ध है। यह काफी बहस योग्य है कि यह एक बग है (commit() सीधे कॉल करने में सक्षम नहीं है)।

+0

+1 - मैं कहूंगा कि यह एक बग है ... लेकिन हे, बोर्क किए गए PHP एपीआई के बारे में बात करते समय उच्च प्राथमिकताएं हैं: पी अच्छा जवाब। –

+0

यह एक बग नहीं है, यह सिर्फ एक भ्रामक नाम है क्योंकि कई लोग लेनदेन के लिए "प्रतिबद्ध" शब्द को लिंक करते हैं। इसका मतलब यह नहीं है कि आपके बकाया लेनदेन स्वचालित रूप से प्रतिबद्ध हैं या नहीं, इसका मतलब यह है कि लेनदेन द्वारा शुरू नहीं किए गए आपके प्रश्न स्वचालित रूप से "प्रतिबद्ध" हैं या नहीं, जो डिफ़ॉल्ट रूप से, वे हैं .. तकनीकी रूप से आपके कनेक्शन लेनदेन शुरू करते हैं यदि यह अक्षम है । –

संबंधित मुद्दे