Notice
Recent Posts
Recent Comments
Link
허허의 오늘은 뭐 먹지?
DB Lock을 방지하기 위한 처리 (Python) 본문
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로 나누어 진행하면 전체 테이블을 잠그지 않게 할 수 있다.
반응형
'SW > 메모' 카테고리의 다른 글
LangChain과 OpenAI를 활용한 대화형 문서 검색 만들기 (0) | 2025.02.08 |
---|---|
Component and Connector View 에 대해 (0) | 2025.01.22 |
추천 - 협업 필터링(Collaborative Filtering) (0) | 2025.01.22 |
추천시스템에서의 알고리즘 정리 (0) | 2025.01.22 |
git 비밀번호를 자꾸 물어볼때. (0) | 2023.08.09 |
Comments