Ý tưởng tôi thường sử dụng khi làm việc với các giao dịch trông giống như sau (mã bán giả) :
try {
// First of all, let's begin a transaction
$db->beginTransaction();
// A set of queries; if one fails, an exception should be thrown
$db->query('first query');
$db->query('second query');
$db->query('third query');
// If we arrive here, it means that no exception was thrown
// i.e. no query has failed, and we can commit the transaction
$db->commit();
} catch (\Throwable $e) {
// An exception has been thrown
// We must rollback the transaction
$db->rollback();
throw $e; // but the error must be handled anyway
}
Lưu ý rằng, với ý tưởng này, nếu một truy vấn không thành công, một Ngoại lệ phải được ném ra:
- PDO có thể làm điều đó, tùy thuộc vào cách bạn định cấu hình nó
- Xem
PDO::setAttribute
- và
PDO::ATTR_ERRMODE
vàPDO::ERRMODE_EXCEPTION
- Xem
- khác, với một số API khác, bạn có thể phải kiểm tra kết quả của hàm được sử dụng để thực thi một truy vấn và tự đưa ra một ngoại lệ.
Thật không may, không có ma thuật nào liên quan. Bạn không thể chỉ đặt một chỉ dẫn ở đâu đó và thực hiện các giao dịch một cách tự động:bạn vẫn phải xác định cụ thể nhóm truy vấn nào phải được thực hiện trong một giao dịch.
Ví dụ:khá thường xuyên, bạn sẽ có một vài truy vấn trước giao dịch (trước khi begin
) và một vài truy vấn khác sau giao dịch (sau commit
hoặc rollback
) và bạn sẽ muốn những truy vấn đó được thực thi bất kể điều gì đã xảy ra (hoặc không) trong giao dịch.