본문 바로가기

[DataBase]/DB

[DB] 무한 select 오류 해결기(트렌젝션 레벨 설정)

반응형

DB 값 변경 요청이 있어 DB를 업데이트 치던 중이었다.
해당 행을 업데이트한뒤 잘 반영된건지 확인하려고 SELECT를 때렸다.
엥? 왜 단순 셀렉튼데 무한 로딩에 빠져버렸다.😱
뭐가 문제지???? 실수했다면 에러 로그를 보며 수정하면되는데
에러 로그도 안뜨고 무한로딩 중일뿐이었다.
뭐 함수가 걸려있나 하나하나 찾아보고 실행계획도 켜서 비용 많이드는곳도 찾아보고 셀렉트 항목도 하나하나 해봤지만 답을 찾을수 없었다 ㅠㅠ
에러 로그라도 나오면 에러로 구글링이라도 할 수 있지만 아무것도 안나오니 정말 화만 날 뿐이었다.
한참을 고민하던 도중 정답을 찾아버렸다.

그건 바로

BEGIN TRAN

이새끼가 날 고생시켰다 ㅡㅡ

DB 수정시에는 항상 조심하기 위해 트랜잭션을 걸고 작업하는걸 추천한다.
하지만 트랜잭션을 걸은 상태에서
잘 된건지 보려고 SELECT를 날렸으니 반응 할리가 있나 ㅡㅡ
LOCK상태에 빠졌는데.. 허허...


항상 간단하게 해결될 에러를 돌아갈때면 정말 허탈하다.. ☹

해결한김에 트랜젝션 레벨 복습하고 가보자

트랜잭션 레벨에는 단계가 있다

1. READ UNCOMMITTED

  • COMMIT 되지 않은 데이터에 다른 트랜잭션에서 접근할수 있다.
  • INSERT, UPDATE, DELETE 후 COMMIT 이나 ROLLBACK에 상관없이 현재의 데이터를 읽어온다.
  • ROLLBACK이 될 데이터도 읽어올 수 있으므로 주의가 필요하다.
  • LOCK이 발생하지 않는다.

    2. READ COMMITTED

  • COMMIT 된 데이터에 다른 트랜잭션에서 접근할 수 있다.
  • 구현 방식이 차이 때문에 Query를 수행한 시점의 데이터와 정확하게 일치하지 않을 수 있다.
  • LOCK이 발생하지 않는다.
  • MySQL에서 많은 양의 데이터를 복제하거나 이동할 때 이 LEVEL을 추천한다.

    3. REPEATABLE READ

  • Default LEVEL이다.
  • SELECT시 현재 시점의 스냅샷을 만들고 스냅샷을 조회한다.
  • 동일 트랜잭션 내에서 일관성을 보장한다.
  • record lock과 gap lock이 발생한다.
  • CREATE SELECT, INSERT SELECT시 lock이 발생한다.

    4. SERIALIZABLE

  • 가장 강력한 LEVEL이다.
  • SELECT 문에 사용하는 모든 테이블에 shared lock이 발생한다.

아래로 갈수록 잠금의 정도가 심함을 나타낸다.

트랙잭션의 레벨을 변경하는 방법은

SET TRANSACTION ISOLATION [원하는 레벨]

을 통해 변경이 가능하며

DBCC USEROPTIONS

명령을 통해 자신의 레벨을 확인 가능하다.

반응형