synch/mutex/innodb/aurora_lock_thread_slot_futex - Amazon Aurora

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

synch/mutex/innodb/aurora_lock_thread_slot_futex

當一個工作階段已鎖定資料列進行更新,而另一個工作階段嘗試更新同一資料列時,synch/mutex/innodb/aurora_lock_thread_slot_futex 事件便會發生。如需詳細資訊,請參閱《MySQL 參考》中的 InnoDB 鎖定

支援的引擎版本

下列引擎版本支援這個等待事件資訊:

  • Aurora MySQL 第 2 版

注意

在 Aurora MySQL 版本 3.01.0 和 3.01.1 中,此等待事件是以 io/table/sql/handler 回報。

等待變多的可能原因

多個資料處理語言 (DML) 陳述式正在同時存取相同的資料列。

動作

我們會建議不同的動作,取決於您看到的其他等待事件。

尋找並回應負責此等待事件的 SQL 陳述式

使用績效詳情來識別負責此等待事件的 SQL 陳述式。請考慮下列策略:

  • 如果資料列鎖定是持續發生的問題,請考慮重寫應用程式以使用樂觀鎖定。

  • 使用多列陳述式。

  • 將工作負載分散到不同的資料庫物件上。您可以透過分割來執行此動作。

  • 檢查 innodb_lock_wait_timeout 參數的值。它控制交易在產生逾時錯誤之前等待多長時間。

如需使用績效詳情進行疑難排解的實用概觀,請參閱部落格文章利用績效詳情分析 Amazon Aurora MySQL 工作負載

尋找並回應封鎖工作階段

判斷封鎖工作階段是閒置還是作用中。此外,了解工作階段來自應用程式還是作用中的使用者。

若要識別保留鎖定的工作階段,您可以執行 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)

當您識別工作階段時,您的選項包括下列項目:

  • 聯絡應用程式擁有者或使用者。

  • 如果封鎖工作階段閒置,請考慮結束封鎖工作階段。此動作可能會觸發長時間回復。若要了解如何結束工作階段,請參閱 結束工作階段或查詢

如需識別封鎖交易的詳細資訊,請參閱《MySQL 參考手冊》中的使用 InnoDB 交易與鎖定資訊