2010-01-25 57 views
11

Nếu tình huống sau có lỗi trong mysql ?.Giao dịch Mysql chờ khóa đã được cấp .. Điều này gây ra bế tắc

Mysql Version: mysql.x86_64 5.0.77-4.el5_4.1

Kernel: Linux box2 2.6.18-128.el5 # 1 SMP Wed 21 Tháng 1 10:41:14 EST 2009 x86_64 x86_64 x86_64 GNU/Linux

------------------------ 
LATEST DETECTED DEADLOCK 
------------------------ 
100125 4:24:41 
*** (1) TRANSACTION: 
TRANSACTION 0 210510625, ACTIVE 155 sec, process no 28125, OS thread id 1243162944 starting index read 
mysql tables in use 1, locked 1 
LOCK WAIT 5 lock struct(s), heap size 1216, undo log entries 1 
MySQL thread id 162928579, query id 527252744 box22 172.16.11.105 user updating 
delete from user_grid_items where user_id = 669786974 and START_X = 45 and START_Y = 65 
*** (1) WAITING FOR THIS LOCK TO BE GRANTED: 
RECORD LOCKS space id 0 page no 61372 n bits 328 index `PRIMARY` of table `gamesutra_beta/user_grid_items` trx id 0 210510625 lock_mode X locks rec but not gap waiting 
Record lock, heap no 127 PHYSICAL RECORD: n_fields 10; compact format; info bits 0 
0: len 8; hex 0000000027ec235e; asc  ' #^;; 1: len 4; hex 0000002d; asc -;; 2: len 4; hex 00000041; asc A;; 3: len 6; hex 00000b561243; asc V C;; 4: len 7; hex 80000040070110; asc @ ;; 5: len 23; hex 474949445f414e494d414c535f53515549445f50494e4b; asc GIID_ANIMALS_SQUID_PINK;; 6: len 4; hex cb59f060; asc Y `;; 7: len 4; hex 4b59f060; asc KY `;; 8: len 4; hex 80000000; asc  ;; 9: len 1; hex 80; asc ;; 

*** (2) TRANSACTION: 
TRANSACTION 0 210505911, ACTIVE 555 sec, process no 28125, OS thread id 1184323904 starting index read, thread declared inside InnoDB 500 
mysql tables in use 1, locked 1 
5 lock struct(s), heap size 1216, undo log entries 1 
MySQL thread id 162924258, query id 527252762 box22 172.16.11.105 user updating 
delete from user_grid_items where user_id = 669786974 and START_X = 45 and START_Y = 65 
*** (2) HOLDS THE LOCK(S): 
RECORD LOCKS space id 0 page no 61372 n bits 328 index `PRIMARY` of table `gamesutra_beta/user_grid_items` trx id 0 210505911 lock mode S locks rec but not gap 
Record lock, heap no 127 PHYSICAL RECORD: n_fields 10; compact format; info bits 0 
0: len 8; hex 0000000027ec235e; asc  ' #^;; 1: len 4; hex 0000002d; asc -;; 2: len 4; hex 00000041; asc A;; 3: len 6; hex 00000b561243; asc V C;; 4: len 7; hex 80000040070110; asc @ ;; 5: len 23; hex 474949445f414e494d414c535f53515549445f50494e4b; asc GIID_ANIMALS_SQUID_PINK;; 6: len 4; hex cb59f060; asc Y `;; 7: len 4; hex 4b59f060; asc KY `;; 8: len 4; hex 80000000; asc  ;; 9: len 1; hex 80; asc ;; 

*** (2) WAITING FOR THIS LOCK TO BE GRANTED: 
RECORD LOCKS space id 0 page no 61372 n bits 328 index `PRIMARY` of table `gamesutra_beta/user_grid_items` trx id 0 210505911 lock_mode X locks rec but not gap waiting 
Record lock, heap no 127 PHYSICAL RECORD: n_fields 10; compact format; info bits 0 
0: len 8; hex 0000000027ec235e; asc  ' #^;; 1: len 4; hex 0000002d; asc -;; 2: len 4; hex 00000041; asc A;; 3: len 6; hex 00000b561243; asc V C;; 4: len 7; hex 80000040070110; asc @ ;; 5: len 23; hex 474949445f414e494d414c535f53515549445f50494e4b; asc GIID_ANIMALS_SQUID_PINK;; 6: len 4; hex cb59f060; asc Y `;; 7: len 4; hex 4b59f060; asc KY `;; 8: len 4; hex 80000000; asc  ;; 9: len 1; hex 80; asc ;; 

*** WE ROLL BACK TRANSACTION (2) 
------------ 
+0

Bạn có thể tìm giải pháp cho vấn đề này không? –

+0

vấn đề tương tự ở đây. Bạn đã tìm thấy một giải pháp? –

+0

Hai khóa yêu cầu là khác nhau (các chế độ khác nhau, đã được cấp khóa là chế độ 'S' chia sẻ/đọc và chờ đợi của nó cho 'X' độc quyền/ghi khóa). Đọc tpo hiểu http://dev.mysql.com/doc/refman/5.0/en/innodb-lock-modes.html – Zimbabao

Trả lời

-4

Sử dụng SHOW ENGINE INNODB STATUS để xác định nguyên nhân gây ra bế tắc mới nhất. Điều đó có thể giúp bạn điều chỉnh ứng dụng của mình để tránh bị deadlocks.

Luôn sẵn sàng phát hành lại giao dịch nếu không thành công do bế tắc. Deadlocks không nguy hiểm. Chỉ cần thử lại.

+2

Đây không phải là một câu trả lời, mà là một sự hồi sinh của 14.2.7.9 Làm thế nào để đối phó với Deadlocks trong hướng dẫn sử dụng MySQL (https://dev.mysql.com/doc/refman/5.0/en/innodb-deadlocks.html). Tệ hơn nữa, nó không có gì để giải quyết câu hỏi của OP. Nếu tôi có đại diện để bác bỏ điều này, tôi sẽ làm như vậy. – dohpaz42

1

Tôi đã đọc điều gì đó từ lâu, và không chắc chắn nếu nó là những gì bạn đang chạy vào kết quả hay không ... mà không nhìn thấy mã của giao dịch hiện tại so với những gì nó xung đột với.

Khi xử lý giao dịch, bạn nên cố gắng để chúng luôn thực hiện bất kỳ khóa nào trong cùng một chuỗi ... Đối với chi tiết đơn đặt hàng/chi tiết đơn đặt hàng, hãy thực hiện các hoạt động theo thứ tự được liệt kê ở đây. Nếu bạn có một quy trình khác thử giao dịch của nó theo thứ tự "Chi tiết đơn hàng/đặt hàng", CÓ THỂ gây ra bế tắc.

Một giao dịch đang khóa thứ tự # trước, sau đó thực hiện chi tiết đơn đặt hàng. Giao dịch khác khóa chi tiết đơn đặt hàng trước, sau đó cố gắng lấy tiêu đề đơn đặt hàng.

HTH

6

Đôi khi SHOW ENGINE INNODB STATUS có thể khó giải mã vì nó chỉ hiển thị câu lệnh hiện tại trong giao dịch. Nó không hiển thị các câu lệnh đã xảy ra trước đó trong cùng một giao dịch có thể có được các khóa thực sự đang được giữ.

Trong trường hợp của bạn, một tuyên bố trước trong giao dịch 2 đã nhận được khóa chia sẻ trên hàng được đề cập.

Sau đó, giao dịch 1 đã cố gắng giành được một khóa độc quyền trên cùng một hàng và vui vẻ chờ khóa chia sẻ được xóa.

Sau đó, giao dịch 2, trong một tuyên bố khác, đã cố gắng để có được một khóa độc quyền trên cùng một hàng. Cổ điển bế tắc. Cả giao dịch đều không thể hoàn thành.

Một giải pháp để giúp tránh bế tắc như vậy là lấy một khóa độc quyền trên hàng trong giao dịch 2 với tuyên bố SELECT FOR UPDATE, trước tuyên bố có được khóa chia sẻ.

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