会话依赖关系主要需要理解锁等待相关四张表的关系。
主要逻辑是:先查询当前会话持有哪些事务的锁和依赖哪些事务的锁,通过这两种锁就可以得到一种图关系。
一:查询当前会话持有的锁:
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.
ID |
Id |
MySQL extension |
USER |
User |
MySQL extension |
HOST |
Host |
MySQL extension |
DB |
db |
MySQL extension |
COMMAND |
Command |
MySQL extension |
TIME |
Time |
MySQL extension |
STATE |
State |
MySQL extension |
INFO |
Info |
MySQL extension |
2.The INFORMATION_SCHEMA INNODB_TRX Table
Table 21.4 INNODB_TRX Columns
TRX_ID |
Unique transaction ID number, internal to InnoDB . (Starting in MySQL 5.6, these IDs are not created for transactions that are read-only and non-locking. See Section 8.5.3, “Optimizing InnoDB Read-Only Transactions”for details.) |
TRX_WEIGHT |
The weight of a transaction, reflecting (but not necessarily the exact count of) the number of rows altered and the number of rows locked by the transaction. To resolve a deadlock, InnoDB selects the transaction with the smallest weight as the “victim” to rollback. Transactions that have changed non-transactional tables are considered heavier than others, regardless of the number of altered and locked rows. |
TRX_STATE |
Transaction execution state. One of RUNNING , LOCK WAIT , ROLLING BACK or COMMITTING . |
TRX_STARTED |
Transaction start time. |
TRX_REQUESTED_LOCK_ID |
ID of the lock the transaction is currently waiting for (if TRX_STATE isLOCK WAIT , otherwise NULL ). Details about the lock can be found by joining with INNODB_LOCKS on LOCK_ID . |
TRX_WAIT_STARTED |
Time when the transaction started waiting on the lock (if TRX_STATE isLOCK WAIT , otherwise NULL ). |
TRX_MYSQL_THREAD_ID |
MySQL thread ID. Can be used for joining with PROCESSLIST on ID . See Section 14.12.2.3.1, “Potential Inconsistency with PROCESSLIST Data”. |
3.The INFORMATION_SCHEMA INNODB_LOCK_WAITS Table
Table 21.6 INNODB_LOCK_WAITS Columns
REQUESTING_TRX_ID |
ID of the requesting transaction. |
REQUESTED_LOCK_ID |
ID of the lock for which a transaction is waiting. Details about the lock can be found by joining with INNODB_LOCKS on LOCK_ID . |
BLOCKING_TRX_ID |
ID of the blocking transaction. |
BLOCKING_LOCK_ID |
ID of a lock held by a transaction blocking another transaction from proceeding. Details about the lock can be found by joining with INNODB_LOCKS on LOCK_ID . |
4.The INFORMATION_SCHEMA INNODB_LOCKS Table
Table 21.5 INNODB_LOCKS Columns
LOCK_ID |
Unique lock ID number, internal to InnoDB . Treat it as an opaque string. Although LOCK_ID currently contains TRX_ID , the format of the data in LOCK_ID is not guaranteed to remain the same in future releases. Do not write programs that parse the LOCK_ID value. |
LOCK_TRX_ID |
ID of the transaction holding this lock. Details about the transaction can be found by joining with INNODB_TRX on TRX_ID . |
LOCK_MODE |
Mode of the lock. One of S , X , IS , IX , S_GAP , X_GAP , IS_GAP , IX_GAP , or AUTO_INC for shared, exclusive, intention shared, intention exclusive row locks, shared and exclusive gap locks, intention shared and intention exclusive gap locks, and auto-increment table level lock, respectively. Refer to the sections Section 14.2.2.1, “InnoDB Lock Modes” andSection 14.2.2, “The InnoDB Transaction Model and Locking” for information on InnoDB locking. |
LOCK_TYPE |
Type of the lock. One of RECORD or TABLE for record (row) level or table level locks, respectively. |
相关推荐
首先,我们来了解一下MySQL Connector/J的工作原理。它遵循JDBC规范,提供了多种接口和类,用于建立、管理和关闭数据库连接,执行SQL语句,处理结果集等。主要涉及的关键类包括`DriverManager`、`Connection`、`...
- 通过开始一个事务并执行DML操作,然后尝试在另一个会话中执行DDL,可以模拟MDL锁等待的情况。 5. 影响与解决: - 如果出现MDL锁等待,所有后续对该表的操作都会被阻塞,可能导致连接堆积和业务中断。 - 解决...
`wait_timeout`是MySQL服务器的会话级变量,它用于设置在没有任何客户端活动(如查询或命令)的情况下,服务器等待客户端发送新数据的时间。默认值通常是8小时(28800秒),但这可以在MySQL的配置文件(my.cnf或my....
#### MySQL会话监听 MySQL服务器通过监听特定端口(默认为3306),等待客户端发起连接请求。当收到连接请求时,MySQL会创建一个新的线程来处理该连接。连接建立后,客户端可以通过发送SQL命令来与数据库交互。 ###...
MySQL默认的会话超时时间是8小时,超过这个时间未使用的连接会被自动断开。对于长时间运行的应用,这可能导致连接失效,进而影响应用程序的稳定性。通过使用Proxool,我们可以设置连接的生命周期,确保即使超过了...
此表记录了等待锁定的情况,这对于识别潜在的死锁和优化锁定策略非常重要。 总的来说,`Information Schema` 提供了大量有价值的信息,可以帮助数据库管理员和开发者更好地理解和优化 MySQL 数据库。通过对这些表的...
了解MDL锁的工作原理和排查方法,有助于我们在面对锁等待问题时,能够更有效地诊断和解决问题,避免对业务造成影响。在日常数据库管理中,应尽量减少长时间持有MDL锁的事务,以优化并发性能和提升系统的响应速度。
MySQL中的事务隔离级别是数据库管理系统确保事务之间正确交互的关键特性,尤其在并发环境中。事务的隔离级别主要包括四种...在MySQL中,可以通过设置`SET TRANSACTION ISOLATION LEVEL`来改变当前会话的事务隔离级别。
- **MySQL** 是一个开源的关系型数据库管理系统(RDBMS),由Oracle公司支持。它以轻量级、高性能著称,在Web应用领域非常流行。 - **PostgreSQL** 是另一个强大的开源RDBMS,以其高度的可扩展性和复杂功能(如...
总的来说,理解MySQL的死锁原理,合理规划事务操作,以及适当利用InnoDB提供的锁和死锁管理机制,是预防和处理死锁的关键。在开发和维护数据库系统时,应该把死锁处理作为重要的一部分,确保系统的稳定性和高可用性...
- **利用MySQL内置工具:** MySQL的信息模式库中包含了几张表(`innodb_trx`, `innodb_lock_waits`, `innodb_locks`),可以用来追踪锁等待关系。通过分析这些表,可以找到当前持有锁的会话。 - **手动干预:** 当...
在数据库管理和编程中,死锁是一个常见的问题,它发生在两个或多个事务在同一资源上相互等待对方释放锁时。在MySQL数据库中,尤其是使用InnoDB存储引擎时,死锁问题不容忽视。理解死锁的原理以及如何预防和解决死锁...
数据库是存储和管理数据的...总的来说,理解数据库的基本原理和操作,无论是MySQL的关系模型还是MongoDB的文档存储,都是开发和管理高效、可靠系统的基石。不断学习和掌握这些技术,将有助于你在IT职业生涯中取得成功。
"v$session_wait"显示当前会话的等待事件,而"v$lock"则提供了锁的详细信息。通过这两个视图的联合查询,可以定位到死锁的具体情况。 MySQL数据库虽然没有内置的死锁日志,但在InnoDB存储引擎中,当发生死锁时,会...
#### MySQL锁 **18. MySQL锁类型** - 表锁:锁定整个表,影响并发性能。 - 行锁:锁定表中的一行或多行,提高并发度。 - 页面锁:锁定表中的一个页面。 **19. 死锁判定原理和具体场景** - **死锁**:两个或多个事务...
- **MySQL 5**:MySQL是一款广泛使用的开源关系型数据库管理系统,可以从MySQL官网下载:<http://dev.mysql.com/downloads/>。 2. **配置Josso与GlassFish集成:** - **部署Josso网关应用**: 1. 将Josso安装包...
当多条查询同时作用于同一张表时,因为MyISAM采用的是表级锁,所有针对这张表的操作必须排队等待,前一条查询执行完毕后,下一个操作才能继续。这种机制确保数据的一致性和事务的隔离性。 - **排它锁(写锁)**: 排...