[DB] Transaction (트랜잭션)

yongkini ·2021년 9월 21일
0

DataBase

목록 보기
3/5

트랜잭션(Transaction)이란 ?

: 트랜잭션이란 SQL 쿼리문으로 예를 들면, 여러개의 쿼리 단위가 실행될 때, 일부만 commit되고, 일부는 commit되지 않는 현상을 방지하기 위한 기능으로, 작업의 완전성을 보장해주기 위한 것이다.

트랜잭션의 특성(ACID)

  • Atomicity(원자성) : 만약 트랜잭션 중간에 어떠한 문제가 발생한다면 트랜잭션에 해당하는 어떠한 작업 내용도 수행되어서는 안되며 아무런 문제가 발생되지 않았을 경우에만 모든 작업이 수행되어야 한다. 즉, 트랜잭션의 단위 내에 하나라도 문제가 생기면 전체를 취소해야하는 것이다.
  • Cosistency(일관성) : 트랜잭션이 완료된 다음의 상태에서도 트랜잭션이 일어나기 전의 상황과 동일하게 데이터의 일관성을 보장해야 한다.
  • Isolation(고립성) : 각각의 트랜잭션은 서로 간섭없이 독립적으로 수행되어야 한다. 하나의 트랜잭션이 진행중일때 또다른 트랜잭션이 해당 트랜잭션을 참조할 수 없다(서로 참조할 수 없다).
  • Durability(영속성) : 트랜잭션이 정상적으로 종료된 다음에는 영구적으로 데이터베이스에 작업의 결과가 저장되어야 한다.

Lock과 Transaction

: Lock은 트랜잭션과는 달리 동시에 수정 쿼리가 들어왔을 때 그 순서를 유지하기 위한 기능이다. 예를 들어, transaction A가 update 요청을 하고, 동시에 tansaction B가 update요청을 했다면, 둘중에 먼저 들어온 요청에 Lock을 걸고 나중에 들어온 요청은 waiting 상태로 두게 된다. 그 다음에 lock을 걸어놓은 트랜잭션이 commited 되면 다시 lock을 풀고, 그 다음 트랜잭션의 요청에 락을 걸게 된다. 정리해보면, 락은 한시점에 하나의 커넥션만 변경할 수 있도록 해주는 것이고, 트랜잭션은 데이터의 정합성을 위한 기능이다.

데드락(DeadLock)이란?

: DeadLock이란 예를 들어, transaction A가 id=201에 대해서 update 요청을 했을 때, 아직 commit을 하지않은채로 있다면 락이 걸려있을 것이다. 이 때, 이렇게 아직 commit되지 않았을 때 또다른 transaction B가 id=305에 대해서 update요청을 보내오면 이 tansaction B에 대해서도 역시 락이 걸릴 것이다. 그렇게되면 tansaction A,B가 lock이 풀릴 때까지 서로를 기다리게되는 상황이되는데 이러한 상황을 데드락이라고 한다. 이는 강제적으로 풀어주지 않는 이상 그대로 유지되는 교착상태인데, 사다리를 내려오려는 사람과 올라가려는 사람이 같은 사다리에서 만났을 때를 비유해볼 수 있다. 서로가 지나가기를 기다리지만, 지나갈 수 없어서 무한히 기다리는 상황이라고 할 수 있다.
:: 참고하면 좋을 블로그

교착 상태의 빈도를 낮추는 방법

  • 트랜잭션을 자주 커밋한다.
  • 정해진 순서로 테이블에 접근한다. 예를 들어, 트랜잭션 1 이 테이블 B -> A 의 순으로 접근했고, 트랜잭션 2 는 테이블 A -> B의 순으로 접근했는데, 이렇게 하지 않고 트랜잭션들이 동일한 테이블 순으로 접근하게 한다.
  • 읽기 잠금 획득 (SELECT ~ FOR UPDATE)의 사용을 피한다.
  • 한 테이블의 복수 행을 복수의 연결에서 순서 없이 갱신하면 교착상태가 발생하기 쉽다, 이 경우에는 테이블 단위의 잠금을 획득해 갱신을 직렬화 하면 동시성을 떨어지지만 교착상태를 회피할 수 있다.
    :: 한재엽님 깃헙 참고
profile
완벽함 보다는 최선의 결과를 위해 끊임없이 노력하는 개발자

0개의 댓글