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

Mysqli::commit और mysqli::rollback कैसे काम करता है?

नहीं, एकल SQL-विवरण विफल होने पर लेन-देन ट्रैक नहीं करता है।

यदि कोई एकल SQL-विवरण कथन विफल हो जाता है वापस लुढ़क गया है (जैसा कि @eggyal's Answer में वर्णित है) - लेकिन लेनदेन अभी भी खुला है। अगर आप commit को कॉल करते हैं अब, सफल कथनों का कोई रोलबैक नहीं है और आपने अभी अपने डेटाबेस में "दूषित" डेटा डाला है। आप इसे आसानी से पुन:पेश कर सकते हैं:

m> CREATE TABLE transtest (id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
 name VARCHAR(100) NOT NULL DEFAULT '',
 CONSTRAINT UNIQUE KEY `uq_transtest_name` (name)) ENGINE=InnoDB;
Query OK, 0 rows affected (0.07 sec)

m> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)

m> INSERT INTO transtest (name) VALUE ('foo');
Query OK, 1 row affected (0.00 sec)

m> INSERT INTO transtest (name) VALUE ('foo');
ERROR 1062 (23000): Duplicate entry 'foo' for key 'uq_transtest_name'

m> INSERT INTO transtest (name) VALUE ('bar');
Query OK, 1 row affected (0.00 sec)

m> COMMIT;
Query OK, 0 rows affected (0.02 sec)

m> SELECT * FROM transtest;
+----+------+
| id | name |
+----+------+
|  3 | bar  |
|  1 | foo  |
+----+------+
2 rows in set (0.00 sec)

आप देखते हैं कि 'फू' और 'बार' का सम्मिलन सफल रहा, हालांकि दूसरा एसक्यूएल-स्टेटमेंट विफल रहा - आप यह भी देख सकते हैं कि AUTO_INCREMENT -मान त्रुटिपूर्ण क्वेरी द्वारा बढ़ा दिया गया है।

इसलिए आपको प्रत्येक query . के परिणामों की जांच करनी होगी -कॉल करें और यदि कोई विफल रहता है, तो rollback पर कॉल करें अन्यथा सफल प्रश्नों को पूर्ववत करने के लिए। तो PHP-मैनुअल में लोरेंजो का कोड समझ में आता है।

एकमात्र त्रुटि जो MySQL को लेनदेन को वापस रोल करने के लिए मजबूर करती है वह एक "लेनदेन गतिरोध" है (और यह InnoDB के लिए विशिष्ट है, अन्य स्टोरेज इंजन उन त्रुटियों को अलग तरीके से संभाल सकते हैं)।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. खेलें! फ्रेमवर्क 1.2.4 --- संचार लिंक विफलता से बचने के लिए C3P0 सेटिंग्स निष्क्रिय समय के लिए करें

  2. PHP फ़ंक्शन MySQL regexp सिंटैक्स से बचने के लिए

  3. MySQL डेटाबेस का नाम कैसे बदलें

  4. MyBatis के साथ MySQL प्रतिकृति (मास्टर/स्लेव) का उपयोग करना

  5. मैं Laravel 5 में कच्चे पीडीओ इंस्टेंस तक नहीं पहुंच सकता