cyyking 2019-06-24
今天主要介绍MySQL会话锁等待关系原理。一般来说,如果要理解mysql会话依赖关系的话,主要是理解锁等待相关四张表的关系。
这里的主要逻辑是:先查询当前会话持有哪些事务的锁和依赖哪些事务的锁,通过这两种锁就可以得到一种图关系。
步骤如下:
1. 查询当前会话processlist.id
2. processlist.id对应innodb_trx表中的TRX_MYSQL_THREAD_ID,这样就可以查询到当前会话的事务id
3. 到lock_waits中查询,其中blocking_trx_id 为当前会话的事务id,这样就获得了当前会话的持有lock_id
4. 根据lock_id到innodb_lock可以查询出当前会话持有锁信息。
其实如果只需要查询会话的依赖的关系不需要知道锁信息的话,到第三步就可以了,通过第三步的REQUESTING_TRX_ID来反查innodb_trx表获取trx_id,反查processlist表就可以得到被当前会话阻塞的会话列表。
步骤如下:
1. 查询当前会话processlist.id
2. processlist.id对应innodb_trx表中的TRX_MYSQL_THREAD_ID,这样就可以查询到当前会话的事务id
3. 到lock_waits中查询REQUESTING_TRX_ID为当前会话的事务id,这样就获得了当前会话的正等待lock_id
4. 根据lock_id到innodb_lock可以查询出当前会话正在等待的锁信息。
同样,其实如果只需要查询会话的依赖的关系不需要知道锁信息的话,到第三步就可以了,通过第三步的blocking_trx_id来反查innodb_trx表获取trx_id,反查processlist表就可以得到被当前会话等待的锁被哪些会话占用了。
下面列出关于锁的核心表部分表结构:
1.INFORMATION_SCHEMA.PROCESSLIST
The PROCESSLIST table provides information about which threads are running.
INFORMATION_SCHEMA Name SHOW Name Remarks
2.The INFORMATION_SCHEMA INNODB_TRX Table
3.The INFORMATION_SCHEMA INNODB_LOCK_WAITS Table
4.The INFORMATION_SCHEMA INNODB_LOCKS Table
篇幅有限,这里就不用实验测试了,大家也可以简单模拟一下死锁,然后再去查这4张表,加深下印象。
后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注一下~