커밋되지 않은 트랜잭션을 확인하는 방법

Henry Hwang -

커밋되지 않은 트랜잭션을 사용하여 세션을 열린 상태로 두면 트랜잭션이 커밋될 때가지 bigc(ClustrixDB garbage collector)가 앞으로 이동할 수 없으므로 언두 공간이 커질 수 있습니다. 그 동안 다른 트랜잭션이 실행 취소 공간을 채우게 됩니다.

커밋되지 않은 명시적 트랜잭션을 식별하려면 다음 쿼리를 사용하십시오.

SELECT * 
FROM   system.sessions 
WHERE  xid IN 
       ( 
                SELECT   xid 
                FROM     system.transactions 
                ORDER BY xid ASC 
                LIMIT    1) \g

샘플 출력:

mysql> select * from system.sessions where xid in (select xid from system.transactions order by xid asc limit 1) \G
*************************** 1. row ***************************
 nodeid: 1
 session_id: 3305627649
 source_ip: 192.168.100.201
 source_port: 61600
 local_ip: 192.168.1.1
 local_port: 3306
 user: 5990219407120025601
 database: test
 trx_state: open <===
 statement_state: finished <===
 xid: 6088543909255731202
 isolation: REPEATABLE-READ
 last_statement: SELECT col1, col2, col3 FROM test_tbl t1 JOIN test2_tbl t2 ON t1.col1 = t2.col1 WHERE t1.col1= 12345
 time_in_state_s: 7487 <===
 created: 2014-12-03 09:06:24
 heap_id: 720576447552535674
 trx_age: 7493 <===
 trx_mode: explicit <===
 trx_counter_select: 25
 trx_counter_insert: 6
trx_counter_update: 0 trx_counter_delete: 0 trx_is_writer: 1 1 row in set (0.10 sec)

trx_state가 "open" 이고 trx_mode가 "explicit" 임에 주목하십시오. 이것은 커밋되지 않은 트랜잭션임을 나타냅니다. 또한 statement_state는 높은 time_in_state_s 및 trx_age 값으로 "finished" 임에 유의하십시오.

일단 커밋되지 않은 트랜잭션을 가진 세션을 식별하면 사용자에게 트랜잭션을 커밋하도록 요청하거나 트랜잭션을 롤백할 세션을 종료할 수 있습니다.

전역 변수 idle_trx_timeout_s는 클러스터가 세션을 종료하고 트랜잭션을 롤백할지 결정하기 전에 세션이 얼마 동안 유휴 상태일 수 있는지 정의합니다.

기본값이 아닌 idle_trx_timeout_s가 높거나 0으로 설정된 경우 이러한 커밋되지 않은 트랜잭션으로 인해 때때로 문제가 발생할 수 있습니다.

클러스터가 유휴 연결을 관리하는 방버을 제어하기 위해 이러한 변수를 설정하는 방법을 보려면 다음을 참조하십시오. Automated Transaction and Session Killers

또 다른 질문이 있으십니까? 문의 등록

0 댓글

댓글을 남기려면 로그인하세요.
Zendesk 제공