2011-06-23 15 views
5

मेरे पास एक आसान प्रयास पकड़ है जो मैं उम्मीद नहीं कर रहा हूं।PHP पीडीओ लेनदेन के मुद्दे

try 
     { 
      $dbo = Db::init(); 
      $dbo->beginTransaction(); 
      $dbo->exec("TRUNCATE TABLE {$this->table}"); 
      $dbo->exec($insert); 
      $dbo->commit(); 
     } 
     catch(Exception $e) 
     { 
      $dbo->rollBack(); 
      echo 'Failed to sync ' . $this->table; 
     } 

समस्या, अगर $dbo->exec($insert); विफल रहता है, $dbo->exec("TRUNCATE TABLE {$this->table}"); वापस लुढ़का नहीं प्राप्त करता है: यह पीडीओ के साथ लेनदेन का उपयोग करने में मेरी पहली कोशिश है। कोई विचार?

+0

'$ insert' क्या है? – tplaner

+0

एक स्ट्रिंग (जो काम कर रही है)। लेकिन अगर मैं उद्देश्य से इसे एक अपवाद फेंकने के लिए एक वाक्यविन्यास त्रुटि डालता हूं, जब यह वापस रोल करता है, तो तालिका के मिटाए जाने से पहले यह रोलबैक नहीं होता है – grep

उत्तर

7

TRUNCATE वापस लुढ़का नहीं जा सकता है। इसके बजाय DELETE का उपयोग करें।

+0

इस तालिका और इसकी संरचना को बनाए रखने के साथ? मैं केवल डेटा को हटाना चाहता हूं लेकिन टेबल को ही नहीं। – grep

+0

@ हेडस्पिन: 'तालिका से हटाएं' --- सभी पंक्तियों को हटा देगा (हालांकि यह धीमा हो जाएगा, लेकिन रोलबैक का समर्थन करता है) – zerkms

+0

@ हेडस्पिन: 'टैबलेटनाम से हटाएं' – zerkms

4

मान लीजिए कि आप MySQL का उपयोग कर रहे हैं, ट्रंकेट टेबल में एक अंतर्निहित COMMIT है। http://dev.mysql.com/doc/refman/5.0/en/truncate-table.html पर प्रलेखन से:

As of MySQL 5.0.8, truncate operations cause an implicit commit. Before 5.0.8, truncate operations are not transaction-safe; an error occurs when attempting one in the course of an active transaction. 
संबंधित मुद्दे