MySQL Transaction--事务相关查询

本文详细介绍了MySQL中四种事务隔离级别的概念及应用,并提供了如何查看和设置这些隔离级别的具体操作命令,包括如何诊断事务锁冲突。

MySQL支持的四种事务隔离级别

READ-UNCOMMITTED
READ-COMMITTED
REPEATABLE-READ
SERIALIZABLE

 

查看全局事务隔离级别和会话事务隔离级别

SHOW GLOBAL VARIABLES LIKE 'tx_isolation';
SHOW SESSION VARIABLES LIKE 'tx_isolation';
SELECT @@GLOBAL.tx_isolation, @@SESSION.tx_isolation; 

 

修改事务隔离级别参数

SET GLOBAL tx_isolation='REPEATABLE-READ'; 
SET GLOBAL transaction_isolation='REPEATABLE-READ';
SET SESSION tx_isolation='SERIALIZABLE';
SET GLOBAL transaction_isolation='REPEATABLE-READ';

tx_isolation和transaction_isolation两者等价相同,修改任意一个即可。

 

修改已开启事务的隔离级别

在事务中修改事务隔离级别,需要使用使用SET TRANSACTION ISOLATION LEVEL 命令来修改事务隔离级别。

语法格式为:

SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}

主要修改时必须使用SESSION或GLOBAL进行修饰,SET TRANSACTION without GLOBAL or SESSION is not permitted while there is an active transaction,否者会报“ERROR 1568 (25001): Transaction characteristics can't be changed while a transaction is in progress”

修改Demo

START TRANSACTION;
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;

 

查看事务锁持有的锁

SELECT  
r.trx_id waiting_trx_id ,
r.trx_query waiting_query ,
b.trx_id blocking_trx_id ,
b.trx_query blocking_query ,
b.trx_mysql_thread_id blocking_thread ,
b.trx_started ,
b.trx_wait_started
FROM information_schema.innodb_lock_waits w
INNER JOIN information_schema.innodb_trx b
ON b.trx_id = w.blocking_trx_id
INNER JOIN information_schema.innodb_trx r
ON r.trx_id = w.requesting_trx_id 

 

查看当前事务使用的事务隔离级别

SELECT 
p.ID,
P.USER,
P.HOST,
p.DB,
P.TIME,
T.trx_started,
T.trx_isolation_level,
T.trx_tables_locked,
T.trx_rows_locked,
t.trx_state,
p.COMMAND AS process_state
FROM `information_schema`.`INNODB_TRX` t
INNER JOIN `information_schema`.`PROCESSLIST` p
ON t.trx_mysql_thread_id=p.id;

 

查看未提交事务

## 查看未提交的事务 ##
SELECT 
p.ID,
P.USER,
P.HOST,
p.DB,
P.TIME,
T.trx_started,
T.trx_isolation_level,
T.trx_tables_locked,
T.trx_rows_locked,
t.trx_state,
p.COMMAND AS process_state
FROM `information_schema`.`INNODB_TRX` t
INNER JOIN `information_schema`.`PROCESSLIST` p
ON t.trx_mysql_thread_id=p.id
WHERE t.trx_state='RUNNING'
AND p.COMMAND='Sleep' 
ORDER BY T.trx_started ASC \G

 

查看阻塞事务

##查看阻塞事务##
SELECT
P2.`ID` BlockProcessID,
p2.`HOST` Blockedhost,  
p2.`USER` BlockedUser,  
r.trx_id BlockedTrxId,      
r.trx_mysql_thread_id BlockedThreadId,      
TIMESTAMPDIFF(      
SECOND,      
r.trx_wait_started,      
CURRENT_TIMESTAMP      
) WaitTime,      
r.trx_query BlockedQuery,      
l.lock_table BlockedTable,    
m.`lock_mode` BlockedLockMode,  
m.`lock_type` BlockedLockType,  
m.`lock_index` BlockedLockIndex,  
m.`lock_space` BlockedLockSpace,  
m.lock_page BlockedLockPage,  
m.lock_rec BlockedLockRec,  
m.lock_data BlockedLockData,
p.`ID` BlockingProcessID,  
p.`HOST` blocking_host,   
p.`USER` blocking_user,  
b.trx_id BlockingTrxid,      
b.trx_mysql_thread_id BlockingThreadId,  
b.trx_query BlockingQuery,  
l.`lock_mode` BlockingLockMode,  
l.`lock_type` BlockingLockType,  
l.`lock_index` BlockingLockIndex,  
l.`lock_space` BlockingLockSpace,  
l.lock_page BlockingLockPage,  
l.lock_rec BlockingLockRec,  
l.lock_data BlockingLockData,           
IF (p.COMMAND = 'Sleep', CONCAT(p.TIME,' seconds'), 0) idel_in_trx               
FROM information_schema.INNODB_LOCK_WAITS w      
INNER JOIN information_schema.INNODB_TRX b 
ON b.trx_id = w.blocking_trx_id      
INNER JOIN information_schema.INNODB_TRX r 
ON r.trx_id = w.requesting_trx_id      
INNER JOIN information_schema.INNODB_LOCKS l 
ON w.blocking_lock_id = l.lock_id  
AND l.`lock_trx_id`=b.`trx_id`  
INNER JOIN information_schema.INNODB_LOCKS m 
ON m.`lock_id`=w.`requested_lock_id` 
AND m.`lock_trx_id`=r.`trx_id`  
INNER JOIN information_schema.PROCESSLIST p 
ON p.ID = b.trx_mysql_thread_id     
INNER JOIN information_schema.PROCESSLIST p2 
ON p2.ID = r.trx_mysql_thread_id   
ORDER BY WaitTime DESC ;

 

转载于:https://www.cnblogs.com/gaogao67/p/10643084.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值