2011-06-29 25 views
15

Nếu tôi có truy vấn multiupdate nàyKhi exacly MySQL khóa một hàng khi cập nhật bảng InnoDB?

UPDATE user u 
INNER JOIN user_profile up ON up.user_id = u.id 
SET u.name = 'same_name_i_already_had', up.profile.age = 25 
WHERE u.id = 10 

Giả sử hàng 10 trong bảng người dùng đã có tên 'same_name_i_already_had', vì vậy nó không nên được cập nhật.

Mặt khác, hàng trong bảng user_profile có độ tuổi khác nhau, vì vậy MySQL nên cập nhật nó.

Giả sử MySQL như RDBMS và InnoDB với hệ thống khóa mức hàng của nó như là động cơ của cả hai bảng,

Liệu MySQL khóa hàng trong bảng sử dụng mặc dù không phải cập nhật các trường tên của hàng đó ?

Cảm ơn !!

Trả lời

12

Nó khóa hàng trong user. Bạn có thể xác minh điều này bằng cách sử dụng công cụ tuyệt vời innotop.

  • Chạy chú thích và nhấn phím 'L' để hiển thị màn hình khóa InnoDB.
  • Mở phiên khác, đăng nhập vào MySQL và BẮT ĐẦU GIAO DỊCH.
  • Thực thi UPDATE bạn đã hiển thị nhưng chưa COMMIT.
  • Xem các khóa trong màn hình innotop.

Ví dụ: tôi đã tạo người dùng bảng và user_profile trên máy ảo thử nghiệm chạy MySQL 5.5 và tôi đã thực hiện các bước tôi liệt kê ở trên. Đây là kết quả đầu ra:

[RO] Locks (? for help) localhost, 08:34.568, InnoDB 10s :-), 0.10 QPS, 2/0/0 con/run/cac thds, 5.5. 

__________________________________________ InnoDB Locks __________________________________________ 
ID Type Waiting Wait Active Mode DB Table   Index Ins Intent Special   
2 TABLE   0 00:00 02:35 IX test user       0     
2 RECORD  0 00:00 02:35 X  test user   PRIMARY   0 rec but not gap 
2 TABLE   0 00:00 02:35 IX test user_profile     0     
2 RECORD  0 00:00 02:35 X  test user_profile PRIMARY   0 rec but not gap 
+0

Câu trả lời hay, tuy nhiên tôi không hiểu ổ khóa TABLE được hiển thị. Bạn có thể giải thích những gì innotop có nghĩa là? –

+2

Chế độ "IX" là khóa cấp bảng có nghĩa là "I * định * khóa một số hàng trong bảng này." Nó sẽ không khóa các khóa mức hàng trên cùng một bảng, nhưng nó sẽ khóa các khóa mức bảng. Xem http://dev.mysql.com/doc/refman/5.5/en/innodb-lock-modes.html để có giải thích đầy đủ về khóa InnoDB và http://innotop.googlecode.com/svn/html/manual .html để giải thích đầy đủ về cách sử dụng chú thích. –

+0

Câu trả lời hay nhất mà tôi từng có. Cảm ơn nhiều! –

4

Hầu như chắc chắn nó khóa hàng bất kể. Tôi không biết bất kỳ trường đơn giản nào được kiểm tra thay đổi trước. Việc khóa, viết và mở khóa dễ dàng và nhanh hơn. Nếu có một kiểm tra trước khi khóa, sau đó có một điều kiện chủng tộc: một cái gì đó mà một khóa hoàn toàn tránh.

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