데이터베이스 Lock의 원인과 해결 방법
1. Lock의 원인
데이터베이스에서 트랜잭션이 실행되는 동안 특정 Table 또는 View에 Lock이 걸릴 수 있습니다.
Lock은 해당 트랜잭션이 완료되거나 롤백될 때까지 유지되며, 이는 데이터베이스의 동시성 제어 메커니즘 중 하나입니다. 이러한 Lock은 데이터 무결성을 보장하지만, 특히 시간이 오래 걸리는 트랜잭션이 발생할 경우 다른 쿼리나 작업의 지연을 유발할 수 있습니다.
실제로 필자는 Materialized View를 자주 갱신하는 기능을 가진 서비스를 제공하면서 해당 문제에 직면한 경험이 있습니다.
Lock의 종류는 DBMS 종류에 따라 약간 차이가 있지만, 본 포스팅은 Postgresql을 기반으로 작성합니다.
EXCLUSIVE LOCK | 가장 많이 직면하는 Lock으로, 트랜잭션에서 데이터 업데이트가 발생할 때 걸리는 Table과 View에 대한 독점적인 Lock 입니다. Exclusive Lock에 걸릴 경우, 다른 세션에서 해당 리소스에 대해 read/write가 불가능 합니다. |
SHARE LOCK | 리소스에 대한 읽기 작업을 허용하면서, 동시에 다른 트랜잭션에서 특정 write 작업을 하지 못하도록 제한하는 Lock 입니다. |
2. Lock의 일시적인 해결 방법
근본적으로 Lock을 해결하기 위해서는 트랜잭션 관리를 신중하게 해야합니다.
하지만, 급하게 Lock을 해결해야할 때 사용할 수 있는 방법으로는 세션을 강제로 죽이는 방법이 있습니다.
1
2
3
4
SELECT t.relname, l.locktype, page, virtualtransaction, pid, mode, granted
FROM pg_locks AS l, pg_stat_all_tables AS t
WHERE l.relation = t.relid and t.relname = '{$table name}'
ORDER BY relation ASC;
위와 같은 쿼리로 특정 Table, View 또는 Materialzied View에 대해 Lock이 걸려있는지 확인할 수 있습니다.
1
SELECT pg_terminate_backend(PID);
이후 Lock을 보유한 세션의 PID를 위의 쿼리를 통해 강제 종료하여, 일시적으로 Lock에 대한 문제를 해결 할 수 있습니다.
마무리
Postgresql에서 Table 또는 View에 Lock이 걸리는 원인과, 해결할 수 있는 방법을 알아보았습니다.
Lock으로 인한 서비스의 중단 문제 등에 대해 일시적으로 해결할 수 있는 방안에 대해 제공을 하였지만,
근본적으로 Lock으로 인한 문제를 해결하기 위해서는 트랜잭션의 신중한 관리가 매우 중요합니다.
감사합니다.