카테고리 없음

[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 쿼리)가 지나가고

 

다음 쿼리가 수행중인 경우 예상과는

 

다른 쿼리가 출력될 경우도 있다