当前位置:Gxlcms > 数据库问题 > MySQL 有关锁的简单介绍

MySQL 有关锁的简单介绍

时间:2021-07-01 10:21:17 帮助过:18人阅读

) [test]> set global innodb_status_output_locks=1; Query OK, 0 rows affected (0.00 sec) (root@localhost) [test]> show variables like %innodb_status_output%; +----------------------------+-------+ | Variable_name | Value | +----------------------------+-------+ | innodb_status_output | OFF | | innodb_status_output_locks | ON | +----------------------------+-------+ 2 rows in set (0.00 sec)

如下是开启 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 表示这个连接也杀掉

 

 四、AI 自增锁

MySQL 的自增存在一个回溯问题,简单说 MySQL 的自增是不持久化的。当数据库被异常重启 可以通过 select max(auto_inc_col)from t for update; 重新获得表的自增起始id 值,这个可能会造成 id 冲突。

自增锁在提交完成之后就已经被释放了。所以自增锁持有的时间是SQL的执行时间。假如你插入的是一个大事务的话就会出现阻塞了。

而x,ix 等是需要commit 之后才能释放的。

 技术图片

设置 innodb_autoinc_lock_mode=2 // 每一条记录加锁释放,这个提高了并发能力,但是可能出现一条语句中的数据不连续了。

 

MySQL 有关锁的简单介绍

标签:pid   record   src   primary   thread   slist   orm   不同的   info   

人气教程排行