MySQL|查看事务加锁情况

文章目录

  • 使用information_schema数据库中的表获取锁信息
    • INNODB_TRX
    • INNODB_LOCKS
    • INNODB_LOCK_WAITS
  • 使用SHOW ENGINE INNODB STATUS获取信息
  • 补充

使用information_schema数据库中的表获取锁信息

在information_schema数据库中,有几个与事务和锁紧密相关的表

INNODB_TRX

INNODB_TRX表结构
MySQL|查看事务加锁情况_第1张图片
该表存储了INNODB存储引擎当前正在执行的事务信息,包括事务id(如果没有为该事务分配唯一的事务id,则会输出该事务对应的内存结构的指针)、事务状态(比如事务是正在运行还是等待获取某个锁、事务正在执行的语句、事务是何时开启的)等等。
比如在一个会话中执行事务T1:
MySQL|查看事务加锁情况_第2张图片

在另一个会话中查询INNODB_TRX表

select * from information_schema.INNODB_TRX;

“”“内容太多无法截图”“”
查询部分内容

select trx_id,trx_state,trx_isolation_level,trx_tables_locked,trx_rows_locked,trx_lock_structs from information_schema.INNODB_TRX;

在这里插入图片描述

  • trx_tables_locked:表示该事务目前加了多少个表级锁;
  • trx_rows_locked:表示该事务目前加了多少个行级锁;(不包括隐式锁)
  • trx_lock_structs:表示该事务生成了多少个内存中的锁结构

INNODB_LOCKS

该表记录了一些锁信息。

  • 如果一个事务想要获取某个锁但未获取到,则记录该锁信息
  • 如果一个事务获取到了某个锁,但是这个锁阻塞了别的事务,则记录该锁信息
    比如,在刚刚开启的事务T1中,给表中的记录加锁
    MySQL|查看事务加锁情况_第3张图片
    查看INNODB_LOCKS表
    在这里插入图片描述
    开启第二个事务T2,执行加锁语句。会发现该语句被锁住了;
    在这里插入图片描述
    查询INNODB_LOCKS表
    在这里插入图片描述
    仅凭以上信息无法判断出,哪个事务因为哪个事务加锁成功而导致被阻塞。可以通过INNODB_LOCK_WAITS获得更多的信息。

INNODB_LOCK_WAITS

表明每个阻塞的事务因为获取不到哪个事务持有的锁而阻塞。
MySQL|查看事务加锁情况_第4张图片

  • requesting_trx_id表示因为获取不到锁而被阻塞的事务的事务id
  • blocking_trx_id表示获取到别的事物需要的锁而导致其被阻塞的事务的事务id
    查询这两个表时都得到了一个“WARING”,查看该waring
    在这里插入图片描述
    原因是这两个表在目前的MySQL版本(5.7)中被标记为“已过时”,未来的版本可能会被删除。(在MySQL中已经被移除)

使用SHOW ENGINE INNODB STATUS获取信息

首先给表加上二级索引

MySQL|查看事务加锁情况_第5张图片

新开启一个事务;执行以下语句

MySQL|查看事务加锁情况_第6张图片

直接通过“show engine innodb status”查看情况,(内容太多只截取部分信息)

MySQL|查看事务加锁情况_第7张图片

  • Trx id counter is 9997下一个待分配的事务ID
  • Purge done for trx’s n:o < 9995 undo n:o <0 一些关于purge的信息
  • History list length 0每个回滚段中都有一个history链表
    为了看出哪个事务对哪些记录加了哪些锁,将系统变量innodb_status_output_locks(这个系统变量是在MySQL5.6.16中引入的)设置为ON:
set global innodb_status_output_locks = ON;

MySQL|查看事务加锁情况_第8张图片

补充

查看字符集

show variables like 'character%';
show variables like  'collation%'
# 查看数据库支持的字符集
show charset;
# 查看数据库的字符集
show create database db_name;
# 查看数据表的字符集
show create table tb_name;

修改字符集

# 修改库字符集
alter database db_name default charset name;
# 修改数据表字符集
alter table tb_name default charset name;
# 建库时指定
create database db_name default charset name;
# 建表时指定
create table tb_name () default charset name;

ps:修改库字符集后库里面的表的字符集不会随着库的字符集更改而更改
(如果在库里面创建表时不指定字符集,这个表的字符集默认是库的字符集)
MySQL|查看事务加锁情况_第9张图片

你可能感兴趣的:(mysql,mysql,数据库,事务,锁)