BEGIN ISOLATION LEVEL READ COMMITTED
라는 SQL Prepare Statement가 어플리케이션에서 발생하면서, 상당시간 SQL 지연이 지속되다가 실행된다.
ISOLATION이란?
ISOLATION은 ACID 의 일환 (Atomicity, Consistency, Isolation, Durability)
이것은 트랜젝션 온전함을 다른 유저나 시스템에게 어떻게 공유할지에 대한 것을 결정한다.
- 낮은 ISOLATION LEVEL은 같은 데이터에 동시에 많은 유저가 다룰수 있도록 하며(동시성을 높임) 다만 동시작업으로 발생할 수 있는 부차적인 문제가 발생한다.
- 높은 ISOLATION LEVEL은 같은 데이터에 동시성을 낮추고, 시스템 부하를 높인다.
- DB SERVERSIDE 뿐만아니라 CLIENT SIDE에서 ISOLATION 을 설정할 수 도 있다.
대부분의 DBAPI는 설정할 수 있는 트랜잭션 격리 수준의 개념을 지원한다.
전통적으로 READ UNCOMMITED, READ COMMITED, REPEATABLE READ, 및 SERIALIZABLE의 네 가지 수준이 있다. 이는 일반적으로 새로운 트랜잭션을 사용하기 전에, DBAPI 연결에 적용되며 대부분의 DBAPI는 SQL문이 처음 생성될 때, 트랜잭션을 암시적으로 시작한다.
SQLAlchemy에서의 ISOLATION
SQLAlchemy는 create_engine 수준과, Connection.execution_options() 수준 모두에서 플래그를 사용하여 엔진 별 또는 연결 별로 설정 가능한 격리 모드를 지원한다.
https://postgresql.kr/docs/13/transaction-iso.html
13.2. 트랜잭션 격리
13.2.2. Repeatable Read Isolation Level The Repeatable Read isolation level only sees data committed before the transaction began; it never sees either uncommitted data or changes committed during transaction execution by concurrent transactions. (However,
postgresql.kr
그러나 문제는 사실 ISOLATION TYPE과 무관하다.
BEGIN ISOLATION LEVEL READ COMMITTED
는 PrepareStatement 로써 지나가는 단계중 하나인데, 여기서 시간이 지연됨을 보인다는 것은 즉 DB Session을 대기하고 있는 그 상태를 보여주는것으로 보인다.
즉 ISOLATION 과는 무관하게, 단지 DB Session을 대기하면서 지연이 발생하는 현상이 전부인것 같다.
DB POOL 설정으로 통해 해결될것으로 기대한다. 아마도 DB Session이 반환이 잘안되는 경우가 있어 이런식으로 조치하였다.
pool = create_async_engine(... pool_recycle=1800)
'Programming > Python' 카테고리의 다른 글
Nori Tokenizer를 활용한 검색서버 개발 (1) | 2023.10.23 |
---|---|
ElasticSearch 406에러 (0) | 2023.10.19 |
SQLAlchemy Metadata로 테이블, 쿼리 개발. JOIN 샘플 (0) | 2023.10.17 |
Python 에서 pip install할때 발생하는 오류들 (0) | 2023.03.21 |
(Python) Pytest로 Unit-test 구현하기 (0) | 2021.05.31 |