synch/mutex/innodb/aurora_lock_thread_slot_futex - Amazon Aurora
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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 事务和锁定信息