2012-08-23 25 views
9

Tôi đang sử dụng thư viện mysqli của PHP. Chèn và cập nhật cơ sở dữ liệu luôn trong khối try-catch. Thành công của mỗi truy vấn được kiểm tra ngay lập tức (if $result === false), và bất kỳ lỗi nào đều có ngoại lệ. Cuộc gọi bắt được mysqli_rollback() và thoát với thông báo cho người dùng.Với PHP và MySQL, bạn có nên kiểm tra xem có lỗi rollback không?

Câu hỏi của tôi là, tôi có nên kiểm tra giá trị trả lại của mysqli_rollback() không? Nếu vậy, và rollback không thành công, mã nào sẽ thực hiện hành động nào?

Tôi có một thời gian khó hiểu cách khôi phục có thể không thành công (chặn một số lỗi nghiêm trọng trong MySQL). Và kể từ khi PHP là sẽ thoát khỏi anyway, gọi rollback gần như có vẻ thừa. Tôi chắc chắn nghĩ rằng nó phải ở trong mã cho rõ ràng, nhưng khi PHP thoát nó sẽ đóng kết nối tới MySQL và các giao dịch không được cam kết sẽ được cuộn lại tự động.

+2

Nếu bạn đang tìm kiếm một ví dụ cụ thể với xác suất thực tế- php của bạn có thể thực thi trên một máy khác với cơ sở dữ liệu chạy trên (ví dụ: máy chủ cơ sở dữ liệu riêng biệt). Mạng io có rất nhiều "công trình bây giờ nhưng không hoạt động trong các kịch bản" thứ hai tiếp theo. Tất nhiên nó có thể xảy ra với cả hai trên cùng một máy quá, ít nhiều khả năng. – goat

+0

Thú vị! Có vẻ như các hàm ý là giống nhau trong kịch bản đó mặc dù: ngay cả khi cuộc gọi rollback không thành công, phiên làm việc MySQL của PHP sẽ kết thúc và việc khôi phục sẽ xảy ra. Vì vậy, có lẽ nó có giá trị đăng nhập lỗi như là một chỉ báo của vấn đề lớn hơn, nhưng bạn vẫn không phải lo lắng về tính toàn vẹn dữ liệu. – giskard22

Trả lời

4

nếu khôi phục không thành công (lỗi kết nối chẳng hạn), các thay đổi sẽ được khôi phục sau khi đóng kết nối, vì vậy bạn không cần xử lý lỗi. Khi bạn đang trong giao dịch, trừ khi bạn có cam kết rõ ràng (hoặc bạn đang chạy trong chế độ tự động, có nghĩa là bạn đã cam kết sau mỗi câu lệnh), giao dịch đang được khôi phục.

Nếu phiên có tự động vô hiệu hóa kết thúc mà không rõ ràng cam kết giao dịch cuối cùng, MySQL sẽ quay lại giao dịch đó.

Trường hợp duy nhất bạn muốn xử lý lỗi rollback là nếu bạn không thoát khỏi tập lệnh của mình, nhưng bắt đầu giao dịch mới sau đó, khi bắt đầu giao dịch sẽ hoàn toàn cam kết hiện tại. Hãy xem Statements That Cause an Implicit Commit

+0

Đó là những gì tôi đã tìm. Tôi đã không nhận thức được báo cáo gây ra cam kết ngầm, vì vậy cảm ơn bạn! Bằng cách này, một liên kết tốt hơn cho thông tin đó có lẽ là [Câu lệnh gây ra một cam kết ngầm] (http://dev.mysql.com/doc/refman/5.1/en/implicit-commit.html) – giskard22

0

mysqli_rollback có thể bị lỗi nếu bạn không (chưa bao giờ) được kết nối với cơ sở dữ liệu. Phụ thuộc vào việc xử lý lỗi của bạn trước khi thực hiện.

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