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ù ...
Ahaaa. Điều đó có ý nghĩa! Cảm ơn bạn :) – Svish