허허의 오늘은 뭐 먹지?

DB Lock을 방지하기 위한 처리 (Python) 본문

SW/메모

DB Lock을 방지하기 위한 처리 (Python)

luminovus 2025. 1. 22. 22:59

DB Lock이나 Table Lock이 발생하지 않도록 하기 위한 Python 처리는 데이터베이스 트랜잭션을 잘 관리하고, 효율적으로 쿼리를 실행하는 것에 달려 있다.. 아래는 이를 위한 몇 가지 접근법이다.

 

1. 트랜잭션 크기 최소화

  • 트랜잭션 내에서 실행하는 작업의 양을 최소화하세요. 트랜잭션이 길어질수록 락이 오래 걸리게 된다.
     
import sqlite3

conn = sqlite3.connect('example.db')
try:
    conn.execute('BEGIN TRANSACTION')
    # 중요한 작업들
    conn.execute('COMMIT')
except Exception as e:
    conn.execute('ROLLBACK')
    print(f"Error: {e}")
finally:
    conn.close()

 

2. 적절한 Isolation Level 선택

  • 데이터베이스마다 Isolation Level을 선택할 수 있다. READ COMMITTED, READ UNCOMMITTED 같은 낮은 수준의 Isolation Level을 선택하면 락 충돌을 줄일 수 있다.
conn = sqlite3.connect('example.db', isolation_level="READ COMMITTED")
 

3. 적절한 인덱스 설정

  • 인덱스를 통해 쿼리 성능을 높이고, 불필요한 테이블 잠금을 피할 수 있다.
  • 필요한 컬럼에 적절히 인덱스를 설정하여 테이블 전체에 lock이 걸리지 않도록 한다.

 

4. 비동기 처리 사용

  • 병렬 또는 비동기 작업을 통해 트랜잭션을 빠르게 처리하여 락이 걸리는 시간을 줄일 수 있다.
import asyncio

async def update_db():
    async with some_async_db_library.connect('example.db') as conn:
        await conn.execute('BEGIN TRANSACTION')
        # 작업 수행
        await conn.execute('COMMIT')

asyncio.run(update_db())

 

5. Optimistic Locking 사용 고려

  • Optimistic Locking은 데이터가 충돌할 가능성이 낮을 때 사용된다. 데이터가 변경되었는지 확인한 후 충돌이 발생하면 트랜잭션을 재시도한다.
  • 보통 version 컬럼을 추가해 사용한다.
# version 컬럼을 사용하여 optimistic locking 구현 예시
def update_record_with_optimistic_locking(conn, id, new_value):
    cursor = conn.cursor()
    cursor.execute("SELECT version FROM table WHERE id=?", (id,))
    current_version = cursor.fetchone()[0]
    
    cursor.execute("""
        UPDATE table SET value=?, version=version+1
        WHERE id=? AND version=?
    """, (new_value, id, current_version))
    
    if cursor.rowcount == 0:
        raise Exception("Optimistic Locking 실패: 다른 트랜잭션에서 업데이트되었습니다.")

    conn.commit()

 

6. 짧고 효율적인 쿼리 작성

  • 단일 대규모 업데이트보다 여러 개의 작은 업데이트가 덜 잠기게 한다.
  • 쿼리가 짧고 효율적으로 실행되도록 쿼리 최적화를 할 것

 

7. 테이블 Lock을 피하기 위한 Chunking

  • 대량의 데이터를 처리할 때, 데이터 처리 작업을 Chunk로 나누어 진행하면 전체 테이블을 잠그지 않게 할 수 있다.

 

반응형
Comments