Mysql数据库系列数据表事务锁处理
Posted 善良勤劳勇敢而又聪明的老杨
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql数据库系列数据表事务锁处理相关的知识,希望对你有一定的参考价值。
1、查看是否是操作数据时未设置事务自动提交
可以先看一下事务是否是自动提交的。
show variables like 'autocommit
如图,如果查出来是ON,表明事务是自动提交的,修改数据之后不用自己提交。如果是OFF的话,就需要把自动提交先先打开了。
set autocommit=on;
2、通过查看数据表查询事务信息
通过查询表统计信息查看
information_schema库下相关事务表和锁相关信息表介绍
innodb_trx
存储了当前正在执行的事务信息
trx_id:事务ID。
trx_state:事务状态,有以下几种状态:RUNNING、LOCK WAIT、ROLLING BACK 和 COMMITTING。
trx_started:事务开始时间。
trx_requested_lock_id:事务当前正在等待锁的标识,可以和 INNODB_LOCKS 表 JOIN 以得到更多详细信息。
trx_wait_started:事务开始等待的时间。
trx_mysql_thread_id:事务线程 ID,可以和 PROCESSLIST 表 JOIN。
trx_tables_locked:表示该事务目前加了多少个表级锁。
trx_lock_structs:表示该事务生成了多少个内存中的锁结构。
trx_lock_memory_bytes:事务锁住的内存大小,单位为 BYTES。
trx_rows_locked:表示该事务目前加了多少个行级锁。
innodb_locks
记录了锁信息
如果一个事务想要获取到某个锁但未获取到,则记录该锁信息
如果一个事务获取到了某个锁,但是这个锁阻塞了别的事务,则记录该锁信息
但是无法通过该表查询到谁被阻塞,谁持有未释放。
lock_id:锁 ID。
lock_trx_id:拥有锁的事务 ID。可以和 INNODB_TRX 表 JOIN 得到事务的详细信息。
lock_mode:锁的模式。
lock_type:锁的类型。RECORD 代表行级锁,TABLE 代表表级锁。
lock_table:被锁定的或者包含锁定记录的表的名称。
innodb_lock_waits
表明每个阻塞的事务是因为获取不到哪个事务持有的锁而被阻塞
requesting_trx_id:–获取不到锁而被阻塞的事务id(等待方)
requested_lock_id:-- 请求锁ID ,事务所等待的锁定的 ID。可以和 INNODB_LOCKS 表 JOIN。
blocking_trx_id: --获取到别的事务需要的锁而阻塞其事务的事务id(当前持有方,待释放)
blocking_lock_id: --这一事务的锁的 ID,该事务阻塞了另一事务的运行。可以和 INNODB_LOCKS 表 JOIN。
processlist
id:标识ID。这与在SHOW PROCESSLIST语句的Id列、Performance Schema threads表的PROCESSLIST_ID列中显示的值类型相同,并由CONNECTION_ID()函数返回
user:发出该语句的mysql用户。
host:发出该语句的客户机的主机名(系统用户除外,没有主机)。
db:默认数据库。
command:线程正在执行的命令的类型。
time:线程处于当前状态的时间(以秒为单位)。
state:指示线程正在执行的操作、事件或状态。
info:线程正在执行的语句,如果没有执行任何语句,则为NULL。
如何借助这几张表来定位到有行锁等待
(1)查看当前有无锁等待
mysql> show status like 'innodb_row_lock%';
(2)查看哪个事务在等待(被阻塞了)
mysql> select * from information_schema.INNODB_TRX WHERE trx_state='LOCK WAIT';
trx_state 表示该事务处于锁等待状态。
trx_query : 当前被阻塞的操作是select * from actor where actor_id=1 for update。
从trx_mysql_thread_id和trx_id可以看到这里查到当前被阻塞的事务的。
后续如果有新的内容,还会更新进来~~~
以上是关于Mysql数据库系列数据表事务锁处理的主要内容,如果未能解决你的问题,请参考以下文章