2010-03-11 14 views
8

मैं पीडीओ के बारे में this tutorial के माध्यम से जा रहा हूं और लेन-देन के बारे में बात करता हूं। कनेक्शन भागों छोड़ा जा रहा है, मैं इस php कोड है:पीडीओ: लेनदेन वापस रोल नहीं करते हैं?

try 
{ 
    $db->beginTransaction(); 

    $db->exec('DROP TABLE IF EXISTS animals'); 

    $db->exec('CREATE TABLE animals (' 
     .'animal_id MEDIUMINT(8) NOT NULL AUTO_INCREMENT PRIMARY KEY,' 
     .'animal_type VARCHAR(25) NOT NULL,' 
     .'animal_name VARCHAR(25) NOT NULL)' 
     .'ENGINE=INNODB'); 

    $db->exec('INSERT INTO animals (animal_type, animal_name) VALUES ("emu", "bruce")'); 
    $db->exec('INSERT INTO animals (animal_type, animal_name) VALUES ("funnel web", "bruce")'); 
    $db->exec('INSERT INTO animals (animal_type, animal_name) VALUES ("lizard", "bruce")'); 
    $db->exec('INSERT INTO animals (animal_type, animal_name) VALUES ("dingo", "bruce")'); 
    $db->exec('INSERT INTO animals (animal_type, animal_name) VALUES ("kangaroo", "bruce")'); 
    $db->exec('INSERT INTO animals (animal_type, animal_name) VALUES ("wallaby", "bruce")'); 
    $db->exec('INSERT INTO animals (animal_type, animal_name) VALUES ("wombat", "bruce")'); 
    $db->exec('INSERT INTO animals (animal_type, animal_name) VALUES ("koala", "bruce")'); 
    $db->exec('INSERT INTO animals (animal_type, animal_name) VALUES ("kiwi", "bruce")'); 

    $db->commit(); 

    echo 'Table re-created and data entered successfully.'; 
} 
catch(PDOException $e) 
{ 
    $db->rollback(); 

    echo $e->getMessage(); 
} 

यह महान चलाता है और जैसे मैंने सोचा कि यह होगा, सिवाय अगर मैं कहीं एक त्रुटि में डाल दिया। जैसे कि मैंने चौथे सम्मिलन कथन में गलती की है, तो मुझे अपने डेटाबेस में तीन जानवर मिलेंगे। लेकिन मैंने सोचा कि चीजें वापस लुढ़कनी जानी चाहिए, जिसका अर्थ है कि मुझे इस स्क्रिप्ट को चलाने से पहले डेटाबेस जैसा मिलेगा।

क्या मैंने कुछ गलत समझा है? मैं क्या खो रहा हूँ? क्या लेन-देन और रोलबैक फ़ंक्शंस कुछ और करता है जो मुझे लगता है कि उन्हें क्या करना चाहिए? क्या ड्रॉप और निर्माण बयान किसी भी तरह लेनदेन को तोड़ रहा है? यहाँ क्या चल रहा है?


अद्यतन: अगर मैं $db->beginTransaction(); लाइन को स्थानांतरित इसलिए लेन-देन शुरू हो जाने के बाद ही टेबल बना दिया गया है, मैं व्यवहार है कि मैं उम्मीद कर रहा था मिलता है। तो अगर तीसरा सम्मिलन कथन विफल हो गया, तो लेनदेन को वापस ले जाने के बाद मेरे पास एक खाली तालिका होगी (क्योंकि इसे अभी बनाया गया था)। फिर भी सोच क्यों यह काम कर रहा है नहीं जब ड्रॉप और बयानों बनाने के लेन-देन हालांकि रहे हैं ...

उत्तर

18

पीएचपी संदर्भ मैनुअल की जाँच करें: PDO::beginTransaction

कुछ MySQL सहित डेटाबेस,, स्वचालित रूप से COMMIT जब एक अंतर्निहित जारी एक डेटाबेस परिभाषा भाषा (डीडीएल) कथन जैसे ड्रॉप टेबल या टेबल बनाना एक लेनदेन के भीतर जारी किया जाता है। निहित COMMIT आपको लेनदेन सीमा के भीतर किसी अन्य परिवर्तन को वापस लाने से रोक देगा।

यह बताता है कि ऐसा क्यों होता है, और यह पीडीओ/PHP के नहीं, MySQL की सीमा है।

+0

आहा। यह समझ आता है! धन्यवाद :) – Svish

2

सुनिश्चित करें कि सभी तालिकाएं लेनदेन का समर्थन करती हैं। उदाहरण के लिए MyISAM का समर्थन नहीं करता है।

+2

जो एक उत्तर से अधिक टिप्पणी है। – hakre

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