2012-05-08 44 views
12

Có thể thực hiện các cuộc gọi chức năng trong khối giao dịch PDO không? Đây là mã đơn giản (sử dụng cơ sở dữ liệu MySql) ...Giao dịch PDO và các cuộc gọi chức năng

try{ 
    $db->beginTransaction(); 

    // call to function that creates user 
    $user_id = create_user(); 

    // call to function that creates company  
    $company_id = create_company(); 

    // call to function to link user & company 
    add_user_to_company($user_id, $company_id); 

    $db->commit(); 
} 

Nếu điều này không thể xảy ra khi sử dụng giao dịch, chiến lược được đề xuất là gì?

Trả lời

11

Trừ khi bất kỳ cuộc gọi hàm nào cố tự mở hoặc tự cam kết giao dịch hoặc sử dụng kết nối khác với kết nối được lưu trữ trong $db, có nó sẽ hoạt động tốt. Đối tượng PDO (hoặc RDBMS cho vấn đề đó) không biết hoặc quan tâm cho dù bạn đang gọi các hàm khác trong PHP. Tất cả những gì nó biết là nếu hành động đang diễn ra trên cùng một kết nối mở như kết nối được mở trong $db. Chúng tôi giả định rằng các hàm đó nhận được $db làm tham số hoặc truy cập nó trên toàn cầu.

Hãy nhớ rằng mặc dù PDO theo dõi trạng thái giao dịch (được hiển thị thông qua PDO::inTransaction()), nó thực sự là RDBMS quản lý trạng thái giao dịch, chứ không phải PDO hoặc mã ứng dụng PHP. Nếu, một hàm cố gắng mở một giao dịch mới trước khi giao dịch trước đó được thực hiện, MySQL's documented behavior là tự động cam kết giao dịch trước đó vì nó không hỗ trợ giao dịch lồng nhau.

Vì vậy, hãy chắc chắn rằng các cuộc gọi chức năng bổ sung của bạn không cố gắng thay đổi trạng thái giao dịch.

+1

Để làm rõ hơn, các giao dịch lồng nhau không được hỗ trợ trong MySQL, vì vậy hãy đảm bảo bạn không bắt đầu giao dịch trong bất kỳ chức năng nào, nếu không sẽ [tự động cam kết giao dịch đang chờ xử lý] (http: //dev.mysql .com/doc/refman/5.5/en/implicit-commit.html). –

+1

Ngoài ra, hãy đảm bảo không sử dụng bất kỳ loại DDL nào (tạo/thay đổi/hủy câu lệnh) vì chúng sẽ thực hiện bất kỳ giao dịch nào bạn đã thực hiện. – Kris

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