2010-03-11 39 views
8

Tôi sẽ thông qua this tutorial về PDO và đã đi đến điểm về giao dịch. Bỏ qua các phần kết nối, tôi có mã php này:PDO: Các giao dịch không quay trở lại?

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(); 
} 

Nó chạy rất tốt và giống như tôi nghĩ, trừ khi tôi đặt lỗi ở đâu đó. Giống như nếu tôi tạo ra một sai lầm trong câu lệnh chèn thứ tư, tôi sẽ tìm thấy ba con vật trong cơ sở dữ liệu của tôi. Nhưng tôi nghĩ mọi thứ được cho là sẽ được khôi phục, có nghĩa là tôi sẽ tìm thấy cơ sở dữ liệu giống như trước khi tôi chạy kịch bản này.

Tôi đã hiểu nhầm điều gì đó chưa? Tôi đang thiếu gì? Các chức năng giao dịch và rollback có làm gì khác hơn những gì tôi nghĩ họ nên làm không? Là thả và tạo ra các tuyên bố "phá vỡ" giao dịch bằng cách nào đó? Những gì đang xảy ra ở đây?


Cập nhật: Nếu tôi chuyển dòng $db->beginTransaction(); nên giao dịch bắt đầu chỉ sau khi bảng đã được tạo ra, tôi nhận được hành vi mà tôi đã mong đợi. Vì vậy, nếu câu lệnh chèn thứ ba sau đó không thành công, tôi sẽ có một bảng trống (vì nó vừa được tạo lại) sau khi giao dịch được khôi phục. Vẫn tự hỏi tại sao nó không làm việc khi thả và tạo báo cáo là trong giao dịch mặc dù ...

Trả lời

18

Kiểm tra hướng dẫn PHP tham khảo: PDO::beginTransaction

Một số cơ sở dữ liệu, bao gồm cả MySQL, tự động phát hành một ngầm COMMIT khi câu lệnh ngôn ngữ định nghĩa cơ sở dữ liệu (DDL) như DROP TABLE hoặc CREATE TABLE được phát hành trong một giao dịch. COMMIT ngầm định sẽ ngăn bạn quay lại bất kỳ thay đổi nào khác trong ranh giới giao dịch.

Điều này giải thích tại sao điều này xảy ra và đó là hạn chế của MySQL chứ không phải của PDO/PHP.

+0

Ahaaa. Điều đó có ý nghĩa! Cảm ơn bạn :) – Svish

2

đảm bảo rằng tất cả các bảng đều hỗ trợ giao dịch. ví dụ MyISAM không hỗ trợ.

+2

đó là một bình luận nhiều hơn là một câu trả lời. – hakre

Các vấn đề liên quan