本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
synch/mutex/innodb/aurora_lock_thread_slot_futex
當一個工作階段已鎖定資料列進行更新,而另一個工作階段嘗試更新同一資料列時,synch/mutex/innodb/aurora_lock_thread_slot_futex
事件便會發生。如需詳細資訊,請參閱我的SQL參考中的 InnoDB 鎖定
支援的引擎版本
下列引擎版本支援這個等待事件資訊:
-
Aurora MySQL 第 2 版
等待時間增加的可能原因
多個資料處理語言 (DML) 陳述式同時存取相同的資料列或資料列。
動作
我們會建議不同的動作,取決於您看到的其他等待事件。
尋找並回應負責此等待事件的SQL陳述式
使用績效詳情來識別負責此等待事件的SQL陳述式。請考慮下列策略:
-
如果資料列鎖定是持續發生的問題,請考慮重寫應用程式以使用樂觀鎖定。
-
使用多列陳述式。
-
將工作負載分散到不同的資料庫物件上。您可以透過分割來執行此動作。
-
檢查
innodb_lock_wait_timeout
參數的值。它控制交易在產生逾時錯誤之前等待多長時間。
如需使用績效詳情進行故障診斷的實用概觀,請參閱部落格文章 使用績效詳情分析 Amazon Aurora MySQL Workloads
尋找並回應封鎖工作階段
判斷封鎖工作階段是閒置還是作用中。此外,了解工作階段來自應用程式還是作用中的使用者。
若要識別保留鎖定的工作階段,您可以執行 SHOW ENGINE INNODB STATUS
。下列範例顯示範例輸出。
mysql> SHOW ENGINE INNODB STATUS; ---------------------TRANSACTION 302631452, ACTIVE 2 sec starting index read mysql tables in use 1, locked 1 LOCK WAIT 2 lock struct(s), heap size 376, 1 row lock(s) MySQL thread id 80109, OS thread handle 0x2ae915060700, query id 938819 10.0.4.12 reinvent updating UPDATE sbtest1 SET k=k+1 WHERE id=503 ------- TRX HAS BEEN WAITING 2 SEC FOR THIS LOCK TO BE GRANTED: RECORD LOCKS space id 148 page no 11 n bits 30 index `PRIMARY` of table `sysbench2`.`sbtest1` trx id 302631452 lock_mode X locks rec but not gap waiting Record lock, heap no 30 PHYSICAL RECORD: n_fields 6; compact format; info bits 0
或者您可以使用下列查詢來擷取目前鎖定的詳細資訊。
mysql> SELECT p1.id waiting_thread, p1.user waiting_user, p1.host waiting_host, it1.trx_query waiting_query, ilw.requesting_trx_id waiting_transaction, ilw.blocking_lock_id blocking_lock, il.lock_mode blocking_mode, il.lock_type blocking_type, ilw.blocking_trx_id blocking_transaction, CASE it.trx_state WHEN 'LOCK WAIT' THEN it.trx_state ELSE p.state END blocker_state, il.lock_table locked_table, it.trx_mysql_thread_id blocker_thread, p.user blocker_user, p.host blocker_host FROM information_schema.innodb_lock_waits ilw JOIN information_schema.innodb_locks il ON ilw.blocking_lock_id = il.lock_id AND ilw.blocking_trx_id = il.lock_trx_id JOIN information_schema.innodb_trx it ON ilw.blocking_trx_id = it.trx_id JOIN information_schema.processlist p ON it.trx_mysql_thread_id = p.id JOIN information_schema.innodb_trx it1 ON ilw.requesting_trx_id = it1.trx_id JOIN information_schema.processlist p1 ON it1.trx_mysql_thread_id = p1.id\G *************************** 1. row *************************** waiting_thread: 3561959471 waiting_user: reinvent waiting_host: 123.456.789.012:20485 waiting_query: select id1 from test.t1 where id1=1 for update waiting_transaction: 312337314 blocking_lock: 312337287:261:3:2 blocking_mode: X blocking_type: RECORD blocking_transaction: 312337287 blocker_state: User sleep locked_table: `test`.`t1` blocker_thread: 3561223876 blocker_user: reinvent blocker_host: 123.456.789.012:17746 1 row in set (0.04 sec)
當您識別工作階段時,您的選項包括下列項目:
-
聯絡應用程式擁有者或使用者。
-
如果封鎖工作階段閒置,請考慮結束封鎖工作階段。此動作可能會觸發長時間回復。若要了解如何結束工作階段,請參閱 結束工作階段或查詢。
如需識別封鎖交易的詳細資訊,請參閱我的SQL參考手冊中的使用 InnoDB 交易和鎖定資訊