2013-08-11 49 views
5

Trong tất cả các bế tắc ví dụ SQL Tôi đã nhìn thấy cho đến nay, một bế tắc xuất hiện trong khi thực hiện một SELECT/UPDATE, vvCó thể xảy ra bế tắc trên cam kết không?

Nếu tất cả các báo cáo của tôi đã được thực hiện thành công, là có bất kỳ cơ hội bế tắc xuất hiện khi tôi COMMIT?

Tôi đang cố gắng nắm bắt ngoại lệ bế tắc bằng ORM của mình và tự hỏi nếu sử dụng try{} xung quanh flush() là đủ, hoặc nếu nó cũng cần bọc commit().

+1

@Martin Cảm ơn sự giúp đỡ của bạn, không cần phải xóa câu trả lời của bạn, câu hỏi của tôi khá chung chung, mặc dù tôi thực sự hạnh phúc nếu ai đó có thể xác nhận những gì bạn đã nói cho MySQL! – Benjamin

+0

Tôi chưa bao giờ thực sự có một thời gian chờ khóa trên một cam kết (và tôi đã có rất nhiều vấn đề thời gian chờ với bản cập nhật), nhưng nói chung bạn nên giả định rằng tất cả các hoạt động db có thể lỗi. Ngay cả trong trường hợp tốt nhất, cam kết có thể thất bại do lỗi IO. – disatisfieddinosaur

+0

@skishore Cam kết chắc chắn có thể thất bại, nhưng tôi không sẵn sàng để bắt những thất bại này. Tôi muốn thử lại deadlocks, không phải những thất bại khác. – Benjamin

Trả lời

1

Có, bế tắc có thể xảy ra khi bạn thực thi COMMIT. Chính xác hơn, ứng dụng của bạn có thể được thông báo về một bế tắc khi nó thực hiện một COMMIT.

Giả sử bạn đang kết nối A và bạn thực hiện một số chuỗi hoạt động. Một cách độc lập, một kết nối khác (Kết nối B) thực hiện một số điều gây ra bế tắc và DBMS quyết định kết nối khôi phục A.

Tuy nhiên, kết nối A đã thực hiện tất cả những gì nó muốn và quyết định COMMIT. Vâng, đây là hoạt động đầu tiên mà khách hàng đang thực hiện trên Kết nối A sau khi DBMS quyết định thực hiện khôi phục và do đó bạn nhận được thông báo về nó tại thời điểm đó.

Bạn nên xử lý lỗi trên mọi thao tác, ngay cả COMMIT.

+0

Theo như tôi hiểu nó, nếu khóa có, kết nối A phải ở trạng thái đợi rồi, và do đó câu lệnh chưa trả lại. Khi B tạo bế tắc, nếu A được chọn làm nạn nhân, lỗi sẽ xảy ra khi câu lệnh đang chờ xử lý trên A trả về, không phải lúc cam kết. – Benjamin

+0

Không đúng sự thật, hãy cân nhắc chuỗi sự kiện này.

B: BEGIN
A: BEGIN
A: CẬP NHẬT
A: UPDATE (thực hiện)
B: UPDATE
B: UPDATE (thực hiện)
A: CẬP NHẬT
A: UPDATE (done)
B: CẬP NHẬT <--- Bản cập nhật này gây ra bế tắc

DBMS quyết định khôi phục A và cho phép B tiếp tục

Vì vậy, cuối cùng:

A: COMMIT <--- Chúng tôi thông báo cho A của bế tắc

Lưu ý rằng A không phải là "chờ đợi" như bạn cho rằng nó sẽ là.
amrith

+0

@Benjamin, tôi không thể chỉnh sửa nhận xét của mình và làm cho chuỗi sự kiện trông dễ đọc hơn nhưng để trả lời câu hỏi bạn đã đặt trong phần nhận xét; có một bế tắc có thể được báo cáo cho kết nối máy khách tại thời gian COMMIT. Nó có thể đã bị gắn cờ bởi DBMS trước đó nhưng cơ hội đầu tiên có sẵn để báo cáo nó cũng có thể là khi COMMIT được ban hành. Hy vọng rằng sẽ giúp. – amrith

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