Hướng dẫn select for update skip locked mysql - chọn để cập nhật bỏ qua mysql bị khóa

MySQL 8.0.1 Giới thiệu hai tính năng mới cho phép bạn quản lý tốt hơn các tình huống mà bạn có các bảng có tranh chấp hàng nóng. & nbsp; Vấn đề này thường xuyên xuất hiện trong các kịch bản như chủ đề công nhân đều truy cập cùng một bảng cố gắng tìm công việc mới và các trang web thương mại điện tử đang cố gắng giữ số lượng hàng tồn kho chính xác.

Ví dụ của tôi cho ngày hôm nay sẽ cố gắng đặt vé vào một trò chơi khúc côn cầu.

Quá trình đặt phòng

Khi đặt vé vào trò chơi, tôi thường được nhắc lần đầu tiên chọn một phần của sân vận động nơi tôi muốn ngồi. & nbsp; Sau đó tôi có được một cái nhìn tổng quan đẹp, với những chỗ ngồi đã được thực hiện màu xám, những chiếc miễn phí trong Blue & NBSP; và những chỗ ngồi mà tôi hiện đang suy ngẫm về màu trắng. & nbsp; Tôi đảm bảo rằng trong hai phút tiếp theo, tôi sở hữu những chiếc ghế trắng:

Hướng dẫn select for update skip locked mysql - chọn để cập nhật bỏ qua mysql bị khóa

Tôi hy vọng hệ thống đặt phòng sẽ đặt một chỗ ngồi tạm thời trên ghế của tôi trong khi tôi hoàn thành (hoặc từ bỏ) đơn đặt hàng của mình. & nbsp; Tương tự, vì tôi đang chọn chỗ ngồi của mình, tôi không mong đợi được hiển thị chỗ ngồi là một phần của việc giữ tạm thời cho người dùng khác:

Hướng dẫn select for update skip locked mysql - chọn để cập nhật bỏ qua mysql bị khóa

Luôn luôn có thể quản lý điều này trong MySQL bằng cách có dữ liệu meta liên kết với mỗi ghế (bán, có sẵn, đang chờ xử lý) cũng như thời gian chờ khi có sẵn chỗ ngồi đang chờ xử lý. & nbsp; Nhưng bắt đầu với mysql 8.0.1 Có một cách tốt hơn (và dễ dàng hơn)

Giới thiệu bỏ qua khóa

Bắt đầu với MySQL 8.0.1, chúng tôi đang giới thiệu công cụ sửa đổi SKIP LOCKED có thể được sử dụng để đọc các hàng từ một bảng trong khi bỏ qua các hàng bị khóa. & nbsp; Điều này có thể được sử dụng bởi hệ thống đặt phòng của chúng tôi để bỏ qua các đơn đặt hàng đang chờ xử lý. & nbsp; ví dụ:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

CREATETABLEseats(TABLEseats(

& nbsp; & nbsp; seat_nointprimary key,seat_noINTPRIMARY KEY,

  bookedENUM('YES','NO')DEFAULT'NO'bookedENUM('YES','NO')DEFAULT'NO'

);

# Tạo 100 hàng mẫu

INSERTINTOseats(seat_no) INTOseats(seat_no)

WITHRECURSIVEmy_cteASRECURSIVEmy_cteAS

.

SELECT1ASn1ASn

Liên minh tất cả

SELECT1+nFROMmy_cteWHEREn1+nFROMmy_cteWHEREn<100

)

SELECT*FROMmy_cte;* FROMmy_cte;

Nếu tôi muốn khóa trên ghế 2 đến 3, tôi chỉ cần:

Bắt đầu giao dịch;TRANSACTION;

Chọn *Từ chỗ ngồi WHERE SEAT_NO giữa2and3andbooked = 'no'FROM seats WHERE seat_no BETWEEN2AND3ANDbooked='NO'

Forupdate bỏ qua bị khóa;UPDATE SKIP LOCKED;

Điều này mang lại cho những chỗ ngồi mà tôi quan tâm, nếu chúng miễn phí và không ai khác đang xem xét chúng ngay bây giờ. Nếu không phải tất cả chúng đều có sẵn, tập kết quả của tôi chứa những cái đó.

Tôi có thể lấy chúng:

UPDATEseatsSETbooked='YES'WHEREseat_noBETWEEN2AND3seatsSETbooked='YES'WHEREseat_noBETWEEN2AND3

COMMIT;;

Hoặc mở khóa chúng, bằng cách làm ROLLBACK.

FOR UPDATE SKIP LOCKED làm điều đó; Trong kết quả của nó, các hàng bị khóa được bỏ qua, như nó đã từng. Và phần FOR UPDATE cần một khóa độc quyền. & nbsp; điều này có thể được xác minh bằng ________ 4 & nbsp; (cũng mới & nbsp; trong 8.0.1):

Bắt đầu giao dịch;;

Chọn *Từ chỗ ngồi WHERE SEAT_NO giữa2and3andbooked = 'no'*FROMseatsWHEREseat_noIN(3,4)FOR UPDATE;

SELECTobject_name,index_name,lock_type,lock_mode,lock_dataobject_name,index_name,lock_type,lock_mode,lock_data

FROMperformance_schema.data_locksWHEREobject_name='seats';performance_schema.data_locksWHEREobject_name='seats';

Forupdate bỏ qua bị khóa;

Điều này mang lại cho những chỗ ngồi mà tôi quan tâm, nếu chúng miễn phí và không ai khác đang xem xét chúng ngay bây giờ. Nếu không phải tất cả chúng đều có sẵn, tập kết quả của tôi chứa những cái đó.object_name|index_name| lock_type|lock_mode|lock_data|

Forupdate bỏ qua bị khóa;

Điều này mang lại cho những chỗ ngồi mà tôi quan tâm, nếu chúng miễn phí và không ai khác đang xem xét chúng ngay bây giờ. Nếu không phải tất cả chúng đều có sẵn, tập kết quả của tôi chứa những cái đó.seats       |NULL       |TABLE     |IX        | NULL      |

Tôi có thể lấy chúng:seats       |PRIMARY    |RECORD    |X         |3         |

Hoặc mở khóa chúng, bằng cách làm ROLLBACK.seats       |PRIMARY    |RECORD    |X         |4         |

Forupdate bỏ qua bị khóa;

Điều này mang lại cho những chỗ ngồi mà tôi quan tâm, nếu chúng miễn phí và không ai khác đang xem xét chúng ngay bây giờ. Nếu không phải tất cả chúng đều có sẵn, tập kết quả của tôi chứa những cái đó.

Tôi có thể lấy chúng: If you are not seeing any rows in performance_schema it could be because you forgot to run START TRANSACTION.  Locks will be held for the duration of a transaction, so it is important to not use auto-commit in these examples.  A ROLLBACK or ROLLBACK1 would also result in the performance_schema tables being empty.

Hoặc mở khóa chúng, bằng cách làm ROLLBACK.

FOR UPDATE SKIP LOCKED làm điều đó; Trong kết quả của nó, các hàng bị khóa được bỏ qua, như nó đã từng. Và phần FOR UPDATE cần một khóa độc quyền. & nbsp; điều này có thể được xác minh bằng ________ 4 & nbsp; (cũng mới & nbsp; trong 8.0.1):

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

Droptableif tồn tại;TABLEIF EXISTSseats;

Createdetableseat_rows (khóa row_nointprimary, CostDecimal);TABLEseat_rows(row_noINTPRIMARY KEY,costDECIMAL);

CREATETABLEseats(TABLEseats(

seat_nointnot null, INTNOT NULL,

row_nointnot null,INTNOT NULL,

bookedENUM('YES','NO')DEFAULT'NO',ENUM('YES','NO')DEFAULT'NO',

Khóa chính (seat_no, row_no)(seat_no,row_no)

);

# Tạo 20 hàng sân vận động với 100 chỗ ngồi/hàng

INSERTINTOseats(seat_no,row_no) INTOseats(seat_no,row_no)

WITHRECURSIVEmy_seatsASRECURSIVEmy_seatsAS

.

SELECT1ASn1ASn

Liên minh tất cả

SELECT1+nFROMmy_seatsWHEREn1+nFROMmy_seatsWHEREn<100

),my_rowsAS my_rowsAS

.

SELECT1ASn1ASn

Liên minh tất cả

SELECT1+nFROMmy_rowsWHEREn1+nFROMmy_rowsWHEREn<20

)

SELECT*FROMmy_seats,my_rows;*FROMmy_seats,my_rows;

# Thêm thông tin giá cho hàng

INSERTINTOseat_rows(row_no,cost)INTOseat_rows(row_no,cost)

WITHRECURSIVEmy_rowsASRECURSIVEmy_rowsAS

.

SELECT1ASn1ASn

Liên minh tất cả

SELECT1+nFROMmy_rowsWHEREn1+nFROMmy_rowsWHERE n<20

)

SELECTn,100-(n*2)FROMmy_rows;n,100-(n*2)FROMmy_rows;

# Thêm thông tin giá cho hàng

Bây giờ, để khóa các hàng chỉ trong ROLLBACK3, bạn sẽ thêm một phần ROLLBACK4 vào mệnh đề khóa:;

SELECTseat_no,row_no,costseat_no,row_no,cost

FROMseatssJOINseat_rowssrUSING(row_no)seatssJOINseat_rowssrUSING(row_no)

WHEREseat_noIN(3,4)ANDsr.row_noIN(5,6)seat_noIN(3,4)AND sr.row_noIN(5,6)

ANDbooked='NO'booked='NO'

Bắt đầu giao dịch;OFsSKIPLOCKED;

Cho UpdateOfSSKiplocked;

Bí danh trong mệnh đề khóa hoạt động giống như bí danh trong phần còn lại của khối truy vấn.

1

2

3

4

5

6

7

8

9

10

11

12

Điều này đảm bảo chỉ các bản ghi trong bảng ROLLBACK3 bị khóa. .object_name,index_name,lock_type,lock_mode,lock_data

Chọn Object_Name, Index_Name, Lock_Type, Lock_Mode, Lock_Dataperformance_schema.data_locks WHERE object_name='seats';

Từ hiệu suất_schema.data_locks trong đó object_name = 'chỗ ngồi';

+-------------+------------+-----------+-------------- -+-----------+object_name|index_name|lock_type|lock_mode|lock_data|

| object_name | index_name | Lock_Type | Lock_Mode | Lock_Data |

+-------------+------------+-----------+-------------- -+-----------+seats       |NULL       |TABLE     |IX        |NULL      |

| chỗ ngồi & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; | Null & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; | Bảng & nbsp; & nbsp; & nbsp; & nbsp; | Ix & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;seats       |PRIMARY    |RECORD    |X         |3,5      |

| chỗ ngồi & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; | Chính & nbsp; & nbsp; & nbsp; & nbsp; | record & nbsp; & nbsp; & nbsp; | 3,5 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; |seats       |PRIMARY    |RECORD    |X         |3,6      |

| chỗ ngồi & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; | Chính & nbsp; & nbsp; & nbsp; & nbsp; | record & nbsp; & nbsp; & nbsp; | 3,6 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; |seats       |PRIMARY    |RECORD    |X         |4,5      |

| chỗ ngồi & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; | Chính & nbsp; & nbsp; & nbsp; & nbsp; | record & nbsp; & nbsp; & nbsp; | 4,5 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; |seats       |PRIMARY    |RECORD    |X         |4,6      |

| object_name | index_name | Lock_Type | Lock_Mode | Lock_Data |

+-------------+------------+-----------+-------------- -+-----------+ rows inset(0.00sec)

| chỗ ngồi & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; | Null & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; | Bảng & nbsp; & nbsp; & nbsp; & nbsp; | Ix & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;

Bây giờ, để khóa các hàng chỉ trong ROLLBACK3, bạn sẽ thêm một phần ROLLBACK4 vào mệnh đề khóa:;

Bắt đầu giao dịch;*FROMseat_rowsWHERErow_no>=10FOR UPDATE;

Cho UpdateOfSSKiplocked;

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

Bây giờ, để khóa các hàng chỉ trong ROLLBACK3, bạn sẽ thêm một phần ROLLBACK4 vào mệnh đề khóa:;

Bắt đầu giao dịch;

SELECTseat_noseat_no

FROMseatsJOINseat_rowsUSING(row_no)seatsJOINseat_rowsUSING(row_no)

WHEREseat_noIN(3,4)ANDseat_rows.row_noIN(5,6)seat_noIN(3,4)ANDseat_rows.row_no IN(5,6)

ANDbooked='NO'booked='NO'

Cho UpdateOfSSKiplocked;OFseatsSKIPLOCKED

FORSHAREOFseat_rows;SHAREOFseat_rows;

Bí danh trong mệnh đề khóa hoạt động giống như bí danh trong phần còn lại của khối truy vấn.

SELECTseat_noseat_no

FROMseatsJOINseat_rowsUSING(row_no)seats JOINseat_rowsUSING(row_no)

WHEREseat_noIN(3,4)ANDseat_rows.row_noIN(12)seat_noIN(3,4)ANDseat_rows.row_noIN(12)

ANDbooked='NO'booked='NO'

Cho UpdateOfSSKiplocked;OFseatsSKIP LOCKED

FORSHAREOFseat_rows;SHAREOFseat_rows;

Bí danh trong mệnh đề khóa hoạt động giống như bí danh trong phần còn lại của khối truy vấn.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

Điều này đảm bảo chỉ các bản ghi trong bảng ROLLBACK3 bị khóa. .object_name,lock_type,lock_mode,lock_data,lock_status FROM performance_schema.data_locks;

Chọn Object_Name, Index_Name, Lock_Type, Lock_Mode, Lock_Data

Từ hiệu suất_schema.data_locks trong đó object_name = 'chỗ ngồi'; object_name|lock_type|lock_mode|lock_data              |lock_status|

Chọn Object_Name, Index_Name, Lock_Type, Lock_Mode, Lock_Data

Từ hiệu suất_schema.data_locks trong đó object_name = 'chỗ ngồi'; seats       |TABLE     |IX        |NULL                   |GRANTED     |

+-------------+------------+-----------+-------------- -+-----------+seats       |RECORD    |X         |3,5                   |GRANTED     |

| chỗ ngồi & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; | Record & nbsp; & nbsp; & nbsp; & nbsp; | x & nbsp; & nbsp; & nbsp; & nbsp; | 3,6 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; | Được cấp & nbsp; & nbsp; & nbsp; & nbsp; |seats       |RECORD    |X         |3,6                   |GRANTED     |

| chỗ ngồi & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; | Record & nbsp; & nbsp; & nbsp; & nbsp; | x & nbsp; & nbsp; & nbsp; & nbsp; | 4,5 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; | Được cấp & nbsp; & nbsp; & nbsp; & nbsp; |seats       |RECORD    |X         |4,5                   |GRANTED     |

| chỗ ngồi & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; | Record & nbsp; & nbsp; & nbsp; & nbsp; | x & nbsp; & nbsp; & nbsp; & nbsp; | 4,6 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; | Được cấp & nbsp; & nbsp; & nbsp; & nbsp; |seats       |RECORD    |X         |4,6                   |GRANTED     |

| seat_rows & nbsp; & nbsp; | Bảng & nbsp; & nbsp; & nbsp; & nbsp; | Là & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; | Được cấp & nbsp; & nbsp; & nbsp; & nbsp; |seat_rows   |TABLE     |IS        |NULL                   |GRANTED     |

| seat_rows & nbsp; & nbsp; | Record & nbsp; & nbsp; & nbsp; & nbsp; | s & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; | 5 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; |seat_rows   |RECORD    |S         |5                      | GRANTED     |

| seat_rows & nbsp; & nbsp; | Record & nbsp; & nbsp; & nbsp; & nbsp; | s & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; | 6 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; |seat_rows   |RECORD    |S         |6                      | GRANTED     |

| seat_rows & nbsp; & nbsp; | Record & nbsp; & nbsp; & nbsp; & nbsp; | s & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; | 12 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; | Chờ & nbsp; & nbsp; & nbsp; & nbsp; |seat_rows   |RECORD    |S         |12                     |WAITING     |

| seat_rows & nbsp; & nbsp; | Bảng & nbsp; & nbsp; & nbsp; & nbsp; | Ix & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; | Được cấp & nbsp; & nbsp; & nbsp; & nbsp; |seat_rows   |TABLE     |IX        |NULL                   |GRANTED     |

| seat_rows & nbsp; & nbsp; | Record & nbsp; & nbsp; & nbsp; & nbsp; | x & nbsp; & nbsp; & nbsp; & nbsp; | 10 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; | Được cấp & nbsp; & nbsp; & nbsp; & nbsp; |seat_rows   |RECORD    |X         |10                     |GRANTED     |

| seat_rows & nbsp; & nbsp; | Record & nbsp; & nbsp; & nbsp; & nbsp; | x & nbsp; & nbsp; & nbsp; & nbsp; | Supremum Pseudo-Record | được cấp & nbsp; & nbsp; & nbsp; & nbsp; |seat_rows   |RECORD    |X         |supremum pseudo-record| GRANTED     |

| seat_rows & nbsp; & nbsp; | Record & nbsp; & nbsp; & nbsp; & nbsp; | x & nbsp; & nbsp; & nbsp; & nbsp; | 11 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; | Được cấp & nbsp; & nbsp; & nbsp; & nbsp; |seat_rows   |RECORD    |X         |11                     |GRANTED     |

| seat_rows & nbsp; & nbsp; | Record & nbsp; & nbsp; & nbsp; & nbsp; | x & nbsp; & nbsp; & nbsp; & nbsp; | 12 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; | Được cấp & nbsp; & nbsp; & nbsp; & nbsp; |seat_rows   |RECORD    |X         |12                     |GRANTED     |

| seat_rows & nbsp; & nbsp; | Record & nbsp; & nbsp; & nbsp; & nbsp; | x & nbsp; & nbsp; & nbsp; & nbsp; | 13 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; | Được cấp & nbsp; & nbsp; & nbsp; & nbsp; |seat_rows   |RECORD    |X         |13                     |GRANTED     |

| seat_rows & nbsp; & nbsp; | Record & nbsp; & nbsp; & nbsp; & nbsp; | x & nbsp; & nbsp; & nbsp; & nbsp; | 14 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; | Được cấp & nbsp; & nbsp; & nbsp; & nbsp; |seat_rows   |RECORD    |X         |14                     |GRANTED     |

| seat_rows & nbsp; & nbsp; | Record & nbsp; & nbsp; & nbsp; & nbsp; | x & nbsp; & nbsp; & nbsp; & nbsp; | 15 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; | Được cấp & nbsp; & nbsp; & nbsp; & nbsp; |seat_rows   |RECORD    |X         |15                     |GRANTED     |

| seat_rows & nbsp; & nbsp; | Record & nbsp; & nbsp; & nbsp; & nbsp; | x & nbsp; & nbsp; & nbsp; & nbsp; | 16 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; | Được cấp & nbsp; & nbsp; & nbsp; & nbsp; |seat_rows   |RECORD    |X         |16                     |GRANTED     |

| seat_rows & nbsp; & nbsp; | Record & nbsp; & nbsp; & nbsp; & nbsp; | x & nbsp; & nbsp; & nbsp; & nbsp; | 17 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; | Được cấp & nbsp; & nbsp; & nbsp; & nbsp; |seat_rows   |RECORD    |X         |17                     |GRANTED     |

| seat_rows & nbsp; & nbsp; | Record & nbsp; & nbsp; & nbsp; & nbsp; | x & nbsp; & nbsp; & nbsp; & nbsp; | 18 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; | Được cấp & nbsp; & nbsp; & nbsp; & nbsp; |seat_rows   |RECORD    |X         |18                     |GRANTED     |

| seat_rows & nbsp; & nbsp; | Record & nbsp; & nbsp; & nbsp; & nbsp; | x & nbsp; & nbsp; & nbsp; & nbsp; | 19 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; | Được cấp & nbsp; & nbsp; & nbsp; & nbsp; |seat_rows   |RECORD    |X         |19                     |GRANTED     |

| seat_rows & nbsp; & nbsp; | Record & nbsp; & nbsp; & nbsp; & nbsp; | x & nbsp; & nbsp; & nbsp; & nbsp; | 20 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; | Được cấp & nbsp; & nbsp; & nbsp; & nbsp; |seat_rows   |RECORD    |X         |20                     |GRANTED     |

+-------------+-----------+-----------+----------- -------------+-------------+

22Rows inset (0,00 giây)rows inset(0.00sec)

Bạn có thể trộn và kết hợp tự do giữa các cường độ khóa ROLLBACK8 và ROLLBACK9 cho bao nhiêu bảng tùy thích. Thật buồn cười, máy móc để làm điều này mọi lúc, nhưng không có cú pháp cho nó. Trước đây bạn chỉ có cú pháp FOR UPDATE hoặc FOR UPDATE SKIP LOCKED1. Bạn vẫn làm, và FOR UPDATE SKIP LOCKED1 là một từ đồng nghĩa với FOR UPDATE SKIP LOCKED3, nhưng cú pháp mới cho phép bạn chỉ định các bảng và phải làm gì khi gặp hàng bị khóa.

SKIP LOCKED là một hành động mà công cụ lưu trữ thực hiện khi gặp hàng bị khóa. Hành động là bỏ qua hàng và thay vào đó, hành động tiếp theo đi vào bộ kết quả. Điều này có thể hoặc không phải là những gì bạn muốn.

Hãy xem xét trường hợp trước đó, trong đó khóa độc quyền (FOR UPDATE SKIP LOCKED5) trên FOR UPDATE SKIP LOCKED6 đã được tổ chức mà không có ý định phát hành nó sớm. & nbsp; Trong trường hợp này, nó có thể là & nbs

Bắt đầu giao dịch;;

# Cố gắng để có được khóa, thất bại ngay lập tức

# Nếu không thể

SELECTseat_noseat_no

FROMseatsJOINseat_rowsUSING(row_no)seatsJOINseat_rowsUSING(row_no)

WHEREseat_noIN(3,4)ANDseat_rows.row_noIN(12)seat_noIN(3,4)AND seat_rows.row_noIN(12)

ANDbooked='NO'booked='NO'

Đối với UpdateOfSeatskiplockedOFseatsSKIPLOCKED

FORSHAREOFseat_rowsNOWAIT;SHAREOFseat_rowsNOWAIT;

Không có FOR UPDATE SKIP LOCKED7, truy vấn này sẽ chờ innodb_lock_wait_timeout (mặc định: 50) giây trong khi cố gắng có được khóa được chia sẻ trên FOR UPDATE SKIP LOCKED8. & nbsp; với FOR UPDATE SKIP LOCKED7, giờ đây nó được hướng dẫn ném lỗi ngay lập tức:

ERROR3572(HY000):Donotwaitforlock.3572(HY000):Donotwaitforlock.

Sự kết luận

Cú pháp để xử lý các hàng nóng là một trong những tính năng được yêu cầu nhiều nhất trong số những người dùng quy mô lớn của chúng tôi và chúng tôi rất vui khi thấy nó được gửi với MySQL 8.0. & nbsp; Trong khi ví dụ của tôi ở đây áp dụng cho đặt chỗ, bạn có thể thấy cách SKIP LOCKEDFOR UPDATE SKIP LOCKED7 áp dụng trong & nbsp; các kịch bản khác:

  • SKIP LOCKED rất tiện dụng trong trường hợp các công nhân đa luồng đang cố gắng tìm n hàng tiếp theo trong một bảng cần xử lý.
  • Bạn có thể sử dụng ________ 27 & nbsp; nếu bạn không lường trước các hàng bị khóa và logic kinh doanh của bạn không có ý nghĩa trong trường hợp có bất kỳ.
  • Bạn có thể trộn và kết hợp giữa SKIP LOCKEDFOR UPDATE SKIP LOCKED7 trong cùng một truy vấn, chỉ bằng cách bạn không thử và sử dụng cả hai trên cùng một bảng.

Chúc may mắn và cảm ơn bạn đã sử dụng MySQL!

Những gì để cập nhật bỏ qua bị khóa?

Mệnh đề bị khóa bỏ qua giúp cải thiện khả năng mở rộng của các ứng dụng cố gắng cập nhật đồng thời cùng một bộ hàng trong bảng.Nó loại bỏ thời gian chờ cho khóa TX.Tính nhất quán và cách ly được bảo tồn.improves the scalability of applications that attempt to concurrently update the same set of rows in a table. It eliminates wait time for TX locks. Consistency and isolation are preserved.

Chọn để cập nhật khóa đọc?

Chọn ... Để cập nhật đọc dữ liệu mới nhất có sẵn, đặt khóa độc quyền trên mỗi hàng mà nó đọc.Do đó, nó đặt cùng một khóa mà một bản cập nhật SQL được tìm kiếm sẽ đặt trên các hàng. FOR UPDATE reads the latest available data, setting exclusive locks on each row it reads. Thus, it sets the same locks a searched SQL UPDATE would set on the rows.

MySQL có khóa một hàng để cập nhật không?

Để cập nhật: Bất kỳ khóa nào được đặt với `for update` sẽ không cho phép các giao dịch khác đọc, cập nhật hoặc xóa hàng.Giao dịch khác chỉ có thể đọc các hàng này khi giao dịch đầu tiên nhận được cam kết hoặc rollback.Any lock placed with the `FOR UPDATE` will not allow other transactions to read, update or delete the row. Other transaction can read this rows only once first transaction get commit or rollback.

Khóa bỏ qua là gì?

Tùy chọn dữ liệu bị khóa bỏ qua cho phép một giao dịch bỏ qua các hàng bị khóa không tương thích bởi các giao dịch khác khi các khóa đó sẽ cản trở tiến trình của giao dịch.Bởi vì tùy chọn dữ liệu bị khóa bỏ qua bỏ qua các hàng này, hiệu suất của một số ứng dụng có thể được cải thiện bằng cách loại bỏ thời gian chờ khóa.allows a transaction to skip rows that are incompatibly locked by other transactions when those locks would hinder the progress of the transaction. Because the SKIP LOCKED DATA option skips these rows, the performance of some applications can be improved by eliminating lock wait time.