Post

데이터베이스 Lock의 원인과 해결 방법

데이터베이스 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으로 인한 문제를 해결하기 위해서는 트랜잭션의 신중한 관리가 매우 중요합니다.

감사합니다.

This post is licensed under CC BY 4.0 by the author.