You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
트랜잭션은 애플리케이션에 데이터베이스에 접근하기 위한 프로그래밍을 쉽게 하기 위해 만들어졌다. 트랜잭션 덕분에 애플리케이션은 동시성 이슈를 겪지 않게 되었다.
완전히 자유로워진건 아니지만..
ACID에서 C는 아무 의미 없다, 그냥 단어를 만들기 위해 들어간 것... consistency는 애플리케이션 책임이다.
그래도, 애플리케이션이 아무리 잘해도 DB에서 write skew같은거 발생하면 consistency가 깨지는데?
트랜잭션의 궁극적인 목적이 consistency라고 할 수 있지 않을까?
Oracle database에서 serializable이라고 불리는 격리 수준은 snapshot isolation을 사용한다. 다른 데이터베이스(예, MySQL)의 repeatable read와 동일한 수준이고, write skew가 발생할 수 있으므로 serializability를 달성했다고 할 수 없다.
AID
Atomicity: abortability가 더 적당한 단어일 수 있음. 트랜잭션이 중간에 실패하면 데이터를 원상복구 할 수 있는 것을 말한다. 멀티스레드 프로그래밍의 atomic operation과는 다르다.
B-Tree는 write ahead log로 구현
LSM-Tree는 원래부터 로그 기반임.
Isolation: 트랜잭션이 다른 트랜잭션이 수정한 데이터를 볼 수 없다. 복수의 트랜잭션이 서로의 영향을 받지 않는다.
lock으로 구현
Durability: 커밋한 트랜잭션의 변경사항은 하드웨어 fault나 데이터베이스 crash가 발생해도 사라지지 않는다.
B-Tree는 write ahead log로 구현
LSM-Tree는 원래부터 로그 기반임.
분산 데이터베이스에서 트랜잭션을 구현하지 못할 근본적인 장애물은 없다 (현실적인 장애물은 있겠지만).
Isolation levels
Read Committed
예방하는 문제: Dirty reads, Dirty writes
row-level lock으로 해결함
Repeatable Read
예방하는 문제
Read skew (nonrepeatable read라고도 불림. 하나의 트랜잭션 안에서 변경하지 않은 값이 조회하는 시점에 따라 달라지는 문제)
Lost update (2개의 스레드가 어떤 정수에 1씩 더했는데 +2가 아니라 +1이 되는 경우.. 고전적인 동시성 문제. MySQL InnoDB의 repeatable read는 이 문제를 예방하지 않으니 주의)
lost update를 예방하는 방법
write conflict가 감지되면 conflict를 만든 두 트랜잭션 중 하나를 취소하고 다시 시도한다 (MySQL InnoDB는 이런거 안해줌)
atomic write operation을 사용한다.
explicit lock을 사용하도록 쿼리를 작성한다 (SELECT FOR UPDATE)
Snapshot Isolation으로 해결함
readers never block writers, and writers never block readers
길다길어
The text was updated successfully, but these errors were encountered: