Để trả lời câu hỏi đầu tiên của bạn ...
Khi sử dụng các giao dịch, các truy vấn của bạn được thực hiện bình thường khi có liên quan đến kết nối của bạn. Bạn có thể chọn cam kết, lưu những thay đổi đó hoặc khôi phục, hoàn nguyên tất cả các thay đổi. Hãy xem xét mã giả sau:
insert into number(Random_number) values (rand());
select Random_number from number where Number_id=Last_insert_id();
// php
if($num < 1)
$this->db->query('rollback;'); // This number is too depressing.
else
$this->db->query('commit;'); // This number is just right.
Số ngẫu nhiên được tạo có thể được đọc trước khi cam kết để đảm bảo rằng nó phù hợp trước khi lưu nó cho mọi người xem (ví dụ:cam kết và mở khóa hàng).
Nếu trình điều khiển PDO không hoạt động, hãy xem xét sử dụng trình điều khiển mysqli. Nếu đó không phải là một tùy chọn, bạn luôn có thể sử dụng truy vấn 'select last_insert_id () as id;' chứ không phải là hàm $ this-> db-> insert_id ().
Để trả lời câu hỏi thứ hai của bạn, nếu bạn đang chèn hoặc cập nhật dữ liệu mà các mô hình khác sẽ cập nhật hoặc đọc, hãy đảm bảo sử dụng các giao dịch. Ví dụ:nếu cột 'Number_remain' được đặt thành 1, sự cố sau có thể xảy ra.
Person A reads 1
Person B reads 1
Person A wins $1000!
Person A updates 1 to be 0
Person B wins $1000!
Person B updates 0 to be 0
Sử dụng các giao dịch trong cùng một tình huống sẽ mang lại kết quả này:
Bạn có thể muốn đọc thêm về các mức cách ly giao dịch nữa.
Hãy cẩn thận với tình trạng bế tắc, có thể xảy ra trong trường hợp này:
Cuối cùng, vì Người B có thể đã đạt đến max_execution_time
của PHP , truy vấn hiện tại sẽ hoàn tất việc thực thi độc lập với PHP, nhưng sẽ không nhận được thêm truy vấn nào. Nếu đây là một giao dịch với autocommit =0, truy vấn sẽ tự động khôi phục khi kết nối với máy chủ PHP của bạn bị ngắt.