-
DB TransactionDatabase/Mysql 2021. 7. 17. 17:05
트랜잭션이란?
DB의 데이터를 변화시키는 논리적인 작업 단위
트랜잭션의 특징
- Atomicity(원자성) : 트랜잭션에 포함된 작업은 전부 수행되거나 전부 수행되지 않는다.
- Consistency(일관성) : 트랜잭션의 실행과 상관없이 DB내의 데이터는 항상 일관된 상태를 유지한다.
- Isolation(격리성) : 한 트랜잭션에 의해 선점된 데이터를 타 트랜잭션의 선점으로부터의 격리 수준을 조절할 수 있다.
- Durability(지속성) : 성공적으로 종료된 트랜잭션은 변경한 데이터가 유실되지 않도록 결과를 DB에 완전히 반영시킨다.
트랜잭션 연산
- commit : 트랜잭션 내의 데이터 보정 작업들이 모두 완료되면, 보정된 데이터들을 한꺼번에 DB에 반영하고 트랜잭션을 종료하는 연산
- rollback : 트랜잭션 내의 데이터 보정 작업들이 DB에 반영되지 않도록, 보정 작업들을 모두 취소하고 UNDO 영역의 백업된 데이터로 DB를 복구한 후 트랜잭션을 종료시키거나 다시 시작시키는 연산
트랜잭션 연산 과정
트랜잭션 격리성
한 트랜잭션에 의해 선점된 데이터에 타 트랜잭션의 접근을 허용하여 격리 수준을 낮추면, 동시에 처리할 수 있는 작업량은 많아지지만 데이터의 정합성이 낮아진다. 반면 타 트랜잭션의 접근을 허용하지 않아 격리 수준을 높이면, 동시에 처리할 수 있는 작업량은 적어지지만 데이터의 정합성이 높아진다. 운영중인 서비스의 성격에 맞게 격리 수준을 선택해서 최적의 동시성을 운용해야 한다.
격리 수준은 아래 4가지로 나뉜다.- READ UNCOMMITED : 특정 트랜잭션이 데이터를 수정했으나 아직 커밋하지 않은 상태에서도, 타 트랜잭션은 이 데이터의 수정된 값을 읽음. 격리성이 가장 낮음.
- READ COMMITED : 특정 트랜잭션이 데이터를 수정한 후 커밋을 완료해야만, 타 트랜잭션은 이 데이터의 수정된 값을 읽음. 커밋 전에는 UNDO 영역에 백업된 값을 읽음.
- REPEATABLE READ : 한 트랜잭션 내에서 SELECT 시 UNDO 영역의 백업된 데이터를 읽음. 타 트랜잭션의 커밋 여부와 상관없이 반복적으로 같은 데이터를 읽음.
- SERIALIZABLE : SELECT를 수행할 때도 해당 데이터에 잠금을 걸어 타 트랜잭션이 아예 접근할 수 없도록 함. (왜 SERIALIZABLE이라는 명칭이 붙었는지는 모르겠음) 격리성이 가장 높음.
ORACLE에서는 READ COMMITED 수준으로, MySQL의 InnoDB 엔진에서는 REPEATABLE READ 수준으로 데이터를 격리시킨다. 두 격리 수준 말고는 잘 쓰이지 않는다.
한편 MySQL의 InnoDB 엔진에서 READ COMMITED 격리 수준을 사용하면 트랜잭션 내의 매 SELECT마다 스냅샷이 생성되고 스냅샷을 기준으로 데이터를 조회한다. 그리고 MySQL의 InnoDB 엔진에서 REPEATABLE READ 격리 수준을 사용하면 첫 SELECT 때만 스냅샷이 생성되고 이후 SELECT 연산은 모두 이 스냅샷을 기준으로 데이터를 조회한다. 즉, MySQL의 InnoDB 엔진에서 REPEATABLE READ 격리 수준을 사용하면 PHANTOM READ가 발생하지 않는다. MySQL의 이 기능을 consistent read라고 한다.'Database > Mysql' 카테고리의 다른 글
Mysql Lock이란? (0) 2023.02.06 MyISAM vs InnoDB (링크) (0) 2021.06.23 댓글