Programming/Python

SQL Alchemy) BEGIN ISOLATION LEVEL READ COMMITTED 이 보이면서 지연이 발생하는 현상

armyost 2024. 6. 13. 21:14
728x90
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)