반응형
MySQL에서 트랜잭션 충돌로 인해 발생하는 "Deadlock found when trying to get lock" 오류의 원인과 해결 방법을 알아봅니다.
1. 오류 개요
MySQL에서 여러 트랜잭션이 서로의 락을 기다리는 상황이 발생하면 다음과 같은 오류가 발생할 수 있습니다.
Error 1213: Deadlock found when trying to get lock; try restarting transaction
이 오류는 서로 다른 트랜잭션이 같은 데이터를 동시에 변경하려 할 때 발생합니다.
2. 주요 원인
- 트랜잭션이 같은 행을 동시에 수정하려고 함
- 락 획득 순서가 충돌하여 교착 상태(deadlock) 발생
- 트랜잭션이 너무 오래 지속되어 락이 해제되지 않음
- 적절한 인덱스가 없어 전체 테이블 스캔이 발생
3. 해결 방법
1) 현재 실행 중인 트랜잭션 및 락 상태 확인
트랜잭션 충돌 여부를 확인하려면 다음 명령어를 실행하세요.
SHOW ENGINE INNODB STATUS;
특정 트랜잭션을 확인하려면:
SELECT * FROM information_schema.innodb_trx;
2) 트랜잭션 실행 순서 변경
트랜잭션이 충돌하는 경우 실행 순서를 조정하여 Deadlock을 방지할 수 있습니다.
BEGIN;
UPDATE orders SET status = 'completed' WHERE order_id = 100;
UPDATE payments SET status = 'paid' WHERE order_id = 100;
COMMIT;
같은 트랜잭션 내에서 일관된 순서로 데이터를 변경하세요.
3) 트랜잭션 타임아웃 조정
Deadlock이 발생하면 자동으로 재시도할 수 있도록 설정할 수 있습니다.
SET innodb_lock_wait_timeout = 50;
4) 적절한 인덱스 추가
인덱스가 없으면 전체 테이블을 스캔하며 락이 발생할 수 있습니다.
ALTER TABLE orders ADD INDEX (order_id);
5) 작은 트랜잭션 단위로 분할
한 번에 너무 많은 데이터를 변경하는 대신 작은 단위로 나누어 실행하세요.
4. 결론
MySQL Deadlock 오류는 주로 트랜잭션 충돌로 인해 발생합니다. 위의 해결 방법을 적용하여 트랜잭션을 최적화하고, Deadlock이 발생하지 않도록 방지할 수 있습니다.
반응형