카테고리 없음

데이터베이스 트랜잭션

이농이능 2018. 6. 5. 15:13

[ 트랜잭션 이란 ? ] 

어떤 작업을 수행할 때 작업이 실패하더라도 이 잘못된 작업이 실질적으로 수행해야 할 작업에는 영향을 미치지 않도록 하는 기능이다.

트랜잭션은 ACID 성질이라고 하는 네가지 성질로 설명된다. 

  • Atomicity : 원자성. 트랜잭션과 관련된 일은 모두 실행되던지 모두 실행되지 않도록 하던지를 보장하는 특성이다.
  • Consistency : 일관성. 트랜잭션이 성공했다면, 데이터베이스는 그 일관성을 유지해야 한다. 일관성은 특정한 조건을 두고, 그 조건을 만족하는지를 확인하는 방식으로 검사할 수 있다.
  • Isolation : 독립성. 트랜잭션을 수행하는 도중에 다른 연산작업이 끼어들지 못하도록 한다. 임계영역을 두는 것으로 달성할 수 있다.
  • Durability : 성공적으로 트랜잭션이 수행되었다면, 그 결과는 완전히 반영이 되어야 한다. 완전히 반영되면 로그를 남기게 되는데, 후에 이 로그를 이용해서 트랜잭션 수행전 상태로 되돌릴 수 있어야 한다. 때문에 트랜잭션은 로그저장이 완료된 시점에서 종료가 되어야 한다.

*isolation level(Transaction 격리 수준)

동시에 여러 트랜잭션이 처리될 때 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있도록 허용할지 말지 결정.

- 격리 수준 : "READ UNCOMMITTED", "READ COMMITTED", "REPEATABLE READ", "SERIALIZABLE"

SQL 표준에서 isolation level은 READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE 네 가지입니다. SERIALIZABLE이 가장 높은 격리수준이지만 성능 상의 이유로 MySQL (InnoDB)은 REPEATABLE READ가 기본값입니다.


1. READ UNCOMMITED(dirty read)

- 거의 사용하지 않음.

변경 내용이 COMMIT이나 ROLLBACK 여부에 상관없이 다른 트랜잭션에서 볼 수 있음.


2. READ COMMITTED

- Oracle DBMS에서 기본적으로 사영되고 있는 격리 수준(Shared Lock 사용)

- 데이터를 변경했더라도 Commit이 완료된 데이터만 다른 트랜잭션에서 조회할 수 있음.

- 어떤 트랜잭션에서 처리한 작업이 commit이 안되어 있다면 다른 트랜잭션은 undo 영역에 있는 기존 값을 참고하여 보여주게 됨.


3. REPEATABLE READ

- MySQL InnoDB에 기본적으로 사용되는 격리 수준.

- 모든 데이터에 shared lock이 걸리게 되므로 다른 사용자는 그 영역에 해당되는 데이터에 대한 수정이 불가능

- 트랜잭션이 Rollback 될 가능성에 대비해 변경되기 전 레코드를 언두 공간에 백업해두고 실제 레코드 값을 변경

- 하나의 트랜잭션 내에 동일 select 쿼리를 실행했을 때 항상 같은 결과를 가져와야 한다는 정합성 정의.

- select를 한 후 재차 확인하는 사이에 데이터 변경이 있어서 동일 select 했을 때 다른 결과가 나오는 것을 방지.


4. SERIALIZABLE

- 동시성이 중요한 DB에서는 거의 사용하지 않음.

- 읽기 작업도 공유 잠금(읽기 잠금)을 획득해야만 하며, 동시에 다른 트랜잭션은 그러한 레코드를 변경하지 못함.

- 한 트랜잭션에서 읽고 쓴느 레코드를 다른 트랜잭션에서 절대 접근할 수 없음.



출처 : https://d2.naver.com/helloworld/407507