https://dev.mysql.com/doc /refman/5.6/en/innodb-lock-modes.html nói:
Điều này có nghĩa là nhiều luồng có thể có được khóa IX. Các khóa này ở cấp bảng, không phải cấp hàng. Khóa IX có nghĩa là luồng đang giữ nó dự định cập nhật một số hàng ở đâu đó trong bàn. Khóa IX chỉ nhằm mục đích chặn các hoạt động toàn bảng.
Nó có thể làm sáng tỏ nếu bạn cho rằng nó đi theo cả hai cách - nếu một hoạt động toàn bảng đang diễn ra, thì luồng đó có một khóa cấp bảng chặn khóa IX.
Các hoạt động DML trước tiên phải có được một khóa IX trước khi chúng có thể thử khóa cấp hàng. Lý do là bạn không muốn DML được phép trong khi có ALTER TABLE
đang được tiến hành hoặc trong khi một số chuỗi khác đã thực hiện LOCK TABLES...WRITE
.
Các thay đổi cấp hàng như UPDATE
, DELETE
, SELECT..FOR UPDATE
không bị khóa IX chặn. Chúng bị chặn bởi các thay đổi cấp độ hàng khác hoặc bởi một khóa toàn bảng thực tế (LOCK TABLES
hoặc các câu lệnh DDL nhất định). Nhưng ngoài các thao tác bảng đó, nhiều luồng chạy DML có thể hoạt động đồng thời, miễn là mỗi luồng làm việc trên một tập hợp các hàng không chồng lên nhau.
Nhận xét lại của bạn:
SELECT...FOR UPDATE
thứ hai không bị chặn khi chờ trên khóa IX, nó bị chặn khi chờ trên khóa X (cấp hàng) trên các hàng đã được khóa bởi khóa X trong một chuỗi khác.
Tôi vừa thử cái này và sau đó tôi chạy SHOW ENGINE INNODB STATUS
vì vậy tôi có thể thấy giao dịch bị chặn:
---TRANSACTION 71568, ACTIVE 12 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 2 lock struct(s), heap size 1136, 1 row lock(s)
MySQL thread id 10, OS thread handle 140168480220928, query id 288 localhost root statistics
select * from test where id=1 for update
------- TRX HAS BEEN WAITING 12 SEC FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 802 page no 3 n bits 72 index `PRIMARY` of table `test`.`test`
trx id 71568 lock_mode X locks rec but not gap waiting
Nhìn thấy? Nó cho biết nó đang chờ được cấp khóa với lock_mode X trên chỉ mục khóa chính của bảng test
. Đó là khóa cấp độ hàng.
Bạn nhầm lẫn về LOCK IN SHARE MODE
:
Bạn đang nói về ba cấp độ của SELECT
.
-
SELECT
yêu cầu không có khóa. Không có ổ khóa nào chặn được và không có ổ khóa nào khác. -
SELECT ... LOCK IN SHARE MODE
yêu cầu khóa IS trên bảng, sau đó S khóa trên các hàng phù hợp với quá trình quét chỉ mục. Nhiều luồng có thể giữ khóa IS hoặc khóa IX trên một bảng. Nhiều luồng có thể giữ S khóa cùng một lúc. -
SELECT ... FOR UPDATE
yêu cầu khóa IX trên bảng, sau đó khóa X trên các hàng phù hợp với quá trình quét chỉ mục. Khóa X là độc quyền có nghĩa là họ không thể có bất kỳ chuỗi nào khác có khóa X hoặc một khóa S trên cùng một hàng.
Nhưng cả khóa X và S đều không quan tâm đến khóa IX hoặc IS.
Hãy nghĩ về sự tương tự này:hãy tưởng tượng một viện bảo tàng.
Nhiều người, cả du khách và người phụ trách, vào bảo tàng. Các du khách muốn xem tranh, vì vậy họ đeo huy hiệu có nhãn "IS". Các giám tuyển có thể thay thế các bức tranh, vì vậy họ đeo một huy hiệu có nhãn "IX". Có thể có nhiều người trong bảo tàng cùng một lúc, với cả hai loại huy hiệu. Chúng không chặn lẫn nhau.
Trong chuyến thăm của họ, những người hâm mộ nghệ thuật nghiêm túc sẽ đến gần bức tranh nhất có thể và nghiên cứu nó trong thời gian dài. Họ rất vui khi để những người hâm mộ nghệ thuật khác đứng cạnh họ trước bức tranh tương tự. Do đó, họ đang thực hiện SELECT ... LOCK IN SHARE MODE
và họ có khóa "S" vì ít nhất họ không muốn bức tranh bị thay thế khi đang nghiên cứu.
Người phụ trách có thể thay thế một bức tranh, nhưng họ lịch sự với những người hâm mộ nghệ thuật nghiêm túc và họ sẽ đợi cho đến khi những người xem này hoàn thành và tiếp tục. Vì vậy, họ đang cố gắng thực hiện SELECT ... FOR UPDATE
(hoặc đơn giản là UPDATE
hoặc DELETE
). Họ sẽ có được ổ khóa "X" vào lúc này, bằng cách treo một biển báo nhỏ cho biết "triển lãm đang được thiết kế lại." Những người hâm mộ nghệ thuật nghiêm túc muốn xem tác phẩm nghệ thuật được trình bày một cách thích hợp, với ánh sáng đẹp và một số biểu tượng mô tả. Họ sẽ đợi thiết kế lại hoàn tất trước khi tiếp cận (họ sẽ nhận được khóa chờ nếu cố gắng).
Ngoài ra, bạn có thể đã ở trong một viện bảo tàng, nơi có nhiều du khách bình thường đi lang thang hơn, cố gắng tránh đường của người khác. Họ nhìn tranh từ giữa phòng, không đến quá gần. Họ có thể nhìn vào những bức tranh tương tự mà người xem khác đang xem, và họ có thể nhìn qua vai của những người hâm mộ nghệ thuật nghiêm túc, để nhìn những bức tranh đang được xem. Họ thậm chí có thể trố mắt nhìn những người phụ trách trong khi họ đang thay thế các bức tranh (họ không quan tâm nếu họ nhìn thấy một bức tranh chưa được gắn và chiếu sáng đúng cách). Vì vậy, những khách truy cập bình thường này không chặn bất kỳ ai và không ai chặn việc xem của họ. Họ chỉ đang thực hiện SELECT
và họ không yêu cầu bất kỳ ổ khóa nào.
Nhưng cũng có những công nhân xây dựng được cho là phải phá bỏ các bức tường và đồ đạc, nhưng họ sẽ không làm việc trong khi có bất kỳ ai trong tòa nhà. Họ sẽ đợi mọi người rời đi và khi bắt đầu công việc, họ sẽ không cho bất kỳ ai vào. Đó là cách sự hiện diện của huy hiệu IS và IX chặn DDL (công trình xây dựng) và ngược lại.