CS/DB

[DB] 트랜잭션(Transaction)

Jutudy 2021. 5. 15. 18:52

트랜잭션(Transaction)

개인적으로 공부하면서 정리하는 글입니다. 내용에 오류가 있는 경우 댓글 달아주시면 수정하도록 하겠습니다.

트랜잭션이란

트랜잭션(Transaction)이란 하나의 논리적인 기능을 수행하기 위한 작업의 단위입니다. 하나의 논리적인 기능은 하나의 쿼리일 수도 있고, 여러 쿼리로 이루어질 수도 있습니다. 트랜잭션은 더 이상 쪼개질 수 없는 가장 작은 단위이므로 해당 트랜잭션 내의 동작은 모두 수행되거나, 모두 수행되지 않아야합니다.

ex) A계좌에서 B계좌로 1000원을 입금하려고 합니다. A계좌의 잔고에서 1000원을 빼고, B계좌의 잔고를 1000원 더해야합니다. 이 작업은 계좌이체의 가장 작은 작업 단위로 둘 중 하나만 수행되면 안되고, 두 작업 모두 수행되어야 합니다. (두 작업 모두 수행되지 않아도 됩니다.)

트랜잭션의 성질

데이터베이스 트랜잭션이 안전하게 수행되는 것을 보장하기 위한 4가지 성질이 있는데, 이 4가지 성질을 줄여서 ACID라고 부릅니다.

Atomicity (원자성)

All or Nothing. 라고 표현할 수 있습니다. 트랜잭션은 더 이상 쪼개질 수 없는 가장 작은 단위입니다. 하나의 트랜잭션 안에 있는 동작은 모두 수행되거나(All), 모두 수행되지 않아야 합니다(Nothing). 계좌이체를 하는데 보내는 쪽 계좌의 잔고는 줄어들고, 받는 쪽 계좌의 잔고는 늘어나지 않는다면 트랜잭션의 원자성이 지켜지지 않는 것입니다.

트랜잭션의 모든 작업이 완료되면 Commit을 통해 DB에 트랜잭션 변경사항을 반영합니다. 반대로 트랜잭션 수행 중 에러가 발생하면 Rollback을 통해 트랜잭션 실행 이전으로 되돌립니다.

Consistency (일관성)

데이터베이스는 트랜잭션이 수행된 이후에도 일관된 상태를 유지해야합니다. 예를 들어, 어떤 테이블의 컬럼이 Not Null인 경우, 트랜잭션이 수행된 이후에도 해당 컬럼은 Not Null이어야 합니다. 트랜잭션의 수행여부와 관계 없이 데이터베이스는 일관된 상태를 유지해야하고, 이것을 무결성이라고 합니다. DB는 무결성을 지키기 위해 제약조건을 설정할 수 있고, 트랜잭션은 DB의 제약조건을 위반할 수 없습니다.

Isolation (고립성)

각각의 트랜잭션은 다른 트랜잭션에 영향을 주지 않아야 합니다. 즉 모든 트랜잭션은 서로 독립적이어야 합니다. 어떤 트랜잭션이 A라는 데이터를 수정하고 있는데 다른 트랜잭션이 A에 접근하면 데이터가 꼬이는 상황이 발생할 수 있습니다. 그래서 트랜잭션에서 사용하고 있는 데이터는 해당 트랜잭션이 종료되어야 다른 트랜잭션이 사용할 수 있습니다.

트랜잭션의 고립성이 높으면 일관성은 향상되지만 병행성이 떨어지게 됩니다. 다수의 사용자가 사용하는 DB는 병행성도 고려해야하기 때문에 적절한 고립수준을 설정하여 일정 수준의 고립성과 병행성을 만족시킵니다.

Durability (지속성)

트랜잭션의 결과는 데이터베이스에 영구적으로 저장되어야 합니다. 프로그램의 데이터는 프로그램이 종료되면 사라지게 되는데 트랜잭션의 결과는 프로그램이 종료되어도 데이터베이스에 영원히 기록되어야 합니다. 데이터베이스는 트랜잭션 완료 후 Commit에 대하여 Commit Log를 남기고, 시스템에 문제가 발생한 경우 Commit Log를 통해 복구할 수 있습니다.