-
[Mysql] mysql lock세션 확인방법,rowlock 확인방법카테고리 없음 2021. 6. 7. 15:39
Mysql 운영중에 row lock 발생하는 경우가 있는데
lock 점유하고 있는 세션 확인방법은 아래와 같다
1) row lock
select
a.trx_mysql_thread_id as waiting_thread_id,
a.trx_query as waiting_query,
c.trx_mysql_thread_id as holding_thread_id,
c.trx_query as holding_query,
timestampdiff(second, a.trx_wait_started, now()) as locking_time
from information_schema.innodb_trx as a
join information_schema.innodb_lock_waits b on (a.trx_id = b.requesting_trx_id)
join information_schema.innodb_trx as c on (c.trx_id = b.blocking_trx_id)\G
[결과 예]
*************************** 1. row ***************************
waiting_thread_id: 16
waiting_query: update t1 set id=1 where id=30
holding_thread_id: 18
holding_query: NULL
locking_time: 3
***************************************************************
>> 결과는 1건16번 쓰레드가 18번 쓰레드로 인해서
row lock 획득 대기 상태
16번의 쿼리는 update
현재 3초간 대기
이미 18번 쓰레드는 쿼리가 수행commit전이기 때문에
수행된 쿼리가 출력되지 않는다
2. 어떠한 쿼리인지 확인하는 방법
SELECT PCU.THREAD_ID, PCU.EVENT_ID, PCU.SQL_TEXT, PCU.ROWS_AFFECTED
FROM PERFORMANCE_SCHEMA.THREADS TH,
PERFORMANCE_SCHEMA.EVENTS_STATEMENTS_CURRENT PCU
WHERE TH.THREAD_ID=PCU.THREAD_ID
AND TH.PROCESSLIST_ID=18;
[결과 예]
+-----------+----------+---------------------------------+---------------+
| THREAD_ID | EVENT_ID | SQL_TEXT | ROWS_AFFECTED |
+-----------+----------+---------------------------------+---------------+
| 62 | 14 | update t1 set id=20 where id=30 | 1 |
+-----------+----------+---------------------------------+---------------+
※두번째 쿼리는 해당하는 스레드의 가장 마지막 쿼리를 출력따라서 이미 row lock이 풀린 상태
트랜잭션 내에서 실제 lock 쿼리
(여기서는 update 쿼리)가 지나가고
다음 쿼리가 수행중인 경우 예상과는
다른 쿼리가 출력될 경우도 있다