2011-07-12 32 views
9

"SELECT ... FOR UPDATE" khóa các hàng được nối trong MySQL không?Khóa MySQL InnoDB trên các hàng đã tham gia

Nếu có, bạn có thể tắt hành vi này không?

Không có gì về điều này trong tài liệu. Tôi đã thấy rằng Oracle hỗ trợ "SELECT ... FOR UPDATE OF table_name" trong đó table_name là bảng chính hoặc một trong các bảng đã nối mà các hàng bị ảnh hưởng sẽ bị khóa, nhưng tôi chưa bao giờ thấy điều này được đề cập trong ngữ cảnh với MySQL.

+0

bản sao kê cập nhật có khóa các hàng trong các bảng khác không? Tôi nghĩ rằng nó nên (có thể nó phụ thuộc vào mức độ cô lập), như các giá trị trong bản cập nhật có thể phụ thuộc vào các giá trị trên bảng khác. Bạn có cần sử dụng để cập nhật không? Có thể khóa trong chế độ chia sẻ là những gì bạn đang tìm kiếm? Dù sao, tôi là cá nhân quan tâm đến câu trả lời này, nhưng có lẽ cách duy nhất để nói là để kiểm tra này. –

+0

Tôi đã thực hiện một số nghiên cứu với thông tin nâng cao được cung cấp bởi plugin InnoDB và số hàng mà giao dịch của tôi đang khóa và hành vi ứng dụng của tôi, tôi sẽ nói rằng MySQL đang khóa tất cả các hàng được nối cùng với các hàng của bảng chính . Tôi đã không thể tìm thấy một điều khoản truy vấn hoặc một tùy chọn InnoDB mà sẽ thay đổi điều này, vì vậy có vẻ như chúng tôi đang mắc kẹt với hành vi mặc định này cho bây giờ. –

+0

Tôi tìm thấy câu trả lời trong Tài liệu MySQL – RolandoMySQLDBA

Trả lời

0

CHỌN ... FOR UPDATE khóa các hàng và mọi mục nhập chỉ mục liên quan, giống như khi bạn đã đưa ra một câu lệnh UPDATE cho các hàng đó.

và sau đó

Nếu autocommit được kích hoạt, các hàng phù hợp với đặc điểm kỹ thuật không bị khóa.

Có phải điều này mySQL doc không cung cấp câu trả lời?

+1

Không, JOIN không được đề cập trong tài liệu. –

4

Xem this MySQL doc page. Nó nói:

Khóa đọc, UPDATE hoặc DELETE thường đặt khóa bản ghi trên mọi bản ghi chỉ mục được quét trong xử lý câu lệnh SQL. Nó không quan trọng cho dù có điều kiện WHERE trong tuyên bố rằng sẽ loại trừ hàng.

và:

Đối SELECT ... FOR UPDATE hoặc SELECT ... KHÓA TRÊN SHARE MODE, ổ khóa được giữ hàng quét, và dự kiến ​​sẽ được phát hành cho các hàng không đủ điều kiện cho bao gồm trong tập kết quả (ví dụ, nếu chúng không đáp ứng các tiêu chí được đưa ra trong mệnh đề WHERE). Tuy nhiên, trong một số trường hợp, các hàng có thể không được mở khóa ngay lập tức vì mối quan hệ giữa hàng kết quả và nguồn gốc của nó bị mất trong quá trình thực thi truy vấn.

"hàng được quét" dùng để chỉ các hàng từ bất kỳ bảng nào được sử dụng trong tham gia.

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