时间:2021-07-01 10:21:17 帮助过:18人阅读
如下是开启 innodb_status_output ,show engine innodb status 输出的详细信息:
找到 TRANSACTIONS , heap_no 2,3,4 表示的是插入的顺序,其中包含两个隐藏列, len 6 是指针列,len 7 是什么列来着忘了
在 show engine innodb status 中的 thread_id 对应的是 show processlist 中 processlist_id 。
这样看有点麻烦,可以借助 information_schema 中的几张表,innodb_trx,innodb_locks,innodb_lock_waits
在 5.7 版本中有一张 innodb_lock_waits
(root@localhost) [sys]> select * from innodb_lock_waits\G *************************** 1. row *************************** wait_started: 2019-02-28 16:26:18 wait_age: 00:00:18 wait_age_secs: 18 locked_table: `test`.`lock_1` locked_index: PRIMARY locked_type: RECORD waiting_trx_id: 260217 waiting_trx_started: 2019-02-28 16:26:18 waiting_trx_age: 00:00:18 waiting_trx_rows_locked: 1 waiting_trx_rows_modified: 0 waiting_pid: 18 waiting_query: update lock_1 set b=6 where a=4 waiting_lock_id: 260217:217:3:3 waiting_lock_mode: X blocking_trx_id: 260213 blocking_pid: 19 blocking_query: NULL blocking_lock_id: 260213:217:3:3 blocking_lock_mode: X blocking_trx_started: 2019-02-28 16:11:46 blocking_trx_age: 00:14:50 blocking_trx_rows_locked: 1 blocking_trx_rows_modified: 0 sql_kill_blocking_query: KILL QUERY 19 sql_kill_blocking_connection: KILL 19 1 row in set, 3 warnings (0.00 sec)# kill query :表示杀掉查询, # kill 表示这个连接也杀掉
自增锁在提交完成之后就已经被释放了。所以自增锁持有的时间是SQL的执行时间。假如你插入的是一个大事务的话就会出现阻塞了。
而x,ix 等是需要commit 之后才能释放的。
设置 innodb_autoinc_lock_mode=2 // 每一条记录加锁释放,这个提高了并发能力,但是可能出现一条语句中的数据不连续了。
MySQL 有关锁的简单介绍
标签:pid record src primary thread slist orm 不同的 info