여러 작업들을 하나로 묶은 단위
한 덩어리의 작업들은 모두 실행되거나, 실행되지 않습니다. (all-or-nothing)
쇼핑몰에서 카드 결제를 완료하고, 그 이후 어딘가에서 에러가 났다. 그때 결제가 되지 않고, 재고에도 변화가 없도록하는 DB에 처리하는 것이 transaction 이다.
돈은 출금되었지만, 쇼핑몰에 송금되지 않고 증발하게 되는 끔찍한 상황이 일어나면 안된다.
transaction은 다음과 같은 상황이 일어나지 않도록 보장해준다.
하지만, 트랜잭션 이라는 단어는 매우 모호하다. 일부 비관계형, 관계형에서 트랜잭션을 따른다고 하지만 이 들은 1975년 IBM 의 R시스템에서 소개된 스타일을 따르고 그 개념이 지금까지 사용되는데 조심스러운 추측이지만, 마케팅적인 용어가 아닌가 싶다.
Transaction 을 좀더 엔지니어적으로 표현하자면 "읽기와 쓰기를 하나의 논리적 단위로 묶는 방법" 이라고 정의할 수 있다.
그리고, 묶여진 단위는 commit 되거나 rollback 이라는 기능이 보장되어야 한다
데이터의 유효성을 보장하기 위한, 트랜잭션 특징들의 앞글자를 딴 단어 입니다.
모든 작업이 반영되거나 전부 수행되지 않는 (롤백되는) 특성입니다
트랜잭션을 수행하기 전이나 후나 데이터베이스는 항상 일관된 상태를 유지해야 한다.
수행 중인 트랜잭션에 다른 트랜잭션이 끼어들어 변경중인 데이터 값을 훼손하지 않아야한다.
수행을 성공적으로 완료한 트랜잭션은 변경한 데이터를 영구히 저장해야 한다.
ACID의 원칙을 너무 타이트하기 지키면 동시성(Concurrency)에 대한 퍼포먼스가 너무 떨어지기 때문에 Isolation Level별로 차등을 두어 동시성에 대한 이점을 가질 수 있게 하지만 아무래도 문제가 발생할 가능성이 커집니다.
ANSI/ISO SQL Standard 에서 정의한 Isolation Level은 다음과 같습니다.
ANSI (American National Standards Institute) : 미국 국립 표준 협회
ISO ( International Organization for Standardization ) : 국제 표준화 기구
참고링크
https://pgdash.io/blog/postgres-transactions.html
https://augustines.tistory.com/68
https://www.slideshare.net/SeokhwanMoon/multitasking-on-db-and-django-164332170
https://stackoverflow.com/questions/974596/what-is-a-database-transaction