반응형
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
명령을 통해 자신의 레벨을 확인 가능하다.
반응형
'[DataBase] > DB' 카테고리의 다른 글
mysqlbinlog 에러 (0) | 2023.08.31 |
---|---|
# mysql, mariadb 백업 안된 쿼리 or 테이블 or 데이터 or 프로시저 등 복구(mysqlbinlog 이용하기) (0) | 2023.07.10 |
MariaDB root 로그인 불가 이슈 (2) | 2023.06.07 |
[장애 회고록] 디스크 I/O 병목, DB 지연 (0) | 2022.11.22 |
[SQL] Injection Attack 예방기 (0) | 2022.03.29 |