MySQL Transaction Isolation Level

-- MySQL 2013. 8. 8. 15:47
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

MySQL의 아래와 같은 transaction isolation level을 가지고 있다. 

READ UNCOMMITTED(dirty read)
다른 트랜잭션이 Commit 전 상태를 볼 수 있음
Binary Log가 자동으로 Row Based로 기록됨 (Statement설정 불가, Mixed 설정 시 자동 변환)

READ-COMMITTED
Commit된 내역을 읽을 수 있는 상태로, 트랜잭션이 다르더라도 특정 타 트랜잭션이 Commit을 수행하면 해당 데이터를 Read할 수 있음
Binary Log가 자동으로 Row Based로 기록됨 (Statement설정 불가, Mixed 설정 시 자동 변환)

REPEATABLE READ
MySQL InnoDB 스토리지 엔진의 Default Isolation Level
Select 시 현재 데이터 버전의 Snapshot을 만들고, 그 Snapshot으로부터 데이터를 조회
동일 트랜잭션 내에서 데이터 일관성을 보장하고 데이터를 다시 읽기 위해서는 트랜잭션을 다시 시작해야 함

SERIALIZABLE
가장 높은 Isolation Level로 트랜잭션이 완료될 때까지 SELECT 문장이 사용하는 모든 데이터에 Shared Lock이 걸림
다른 트랜잭션에서는 해당 영역에 관한 데이터 변경 뿐만 아니라 입력도 불가



innoDB transaction isolation level과 binlog enable 시 문제점 정리


MySQL의 innoDB의 default isolation level은 REPETEABLE READ이다. 결국 트랜잭션이 처음 시작했을 때의 데이터를 가지고 있고 그것을 한 트랜잭션 내에서 계속 사용하는 것이다. 

여러개의 프로세스가 동시에 DB에 접속해 빈번하게 commit이 일어나고 또한 트랜잭션이 수시로 변경된 내용을 참조해야하는 특징이 있어서 트랜잭션이 READ COMMITED로 변경하여 사용하였다. 

MySQL binlog를 enable 한 시점부터 기존의 문제 없던 트랜잭션에서 아래와 같은 문제가 생기기 시작했다.Transaction level 'READ-COMMITTED' in InnoDB is not safe for binlog mode 'STATEMENT'  

원인은 MySQL binlog type(STATEMENT)과 transaction-isolation level(READ-COMMITED)의 충돌 생겨서이다. 

출처 : http://blog.naver.com/juner84?Redirect=Log&logNo=100190763625

'-- MySQL' 카테고리의 다른 글

MySQL 대용량 Insert  (0) 2013.10.15
반올림, 버림  (0) 2013.08.20
Slow query logging  (0) 2013.07.17
대량 insert를 위해 Lock Table, Disable Keys 사용  (0) 2013.07.10
MySQL Linked Server - Federated Engine  (0) 2013.07.08
posted by 어린왕자악꿍