• terminology
    • ACID: 아래 항목들을 보장할 수 없으면 abandon해버림
      • atomic: 하나의 process는 두 개로 쪼개질 수 없음. 한 task가 진행중이라면 그 중간 결과 확인도 불가
        • task 실패 시 통째로 날려도 지장 없어야 함
        • abortability
      • consistency: db가 특정 상태를 유지해야 함. application단의 영향이 큼
      • isolation: concurrency와 연관.
        • weak isolation level: isolation 구현을 위해 드는 cost 절약을 위해 일부 risk를 지는 방식
      • durability: hardware fault 등에도 불구, data 손실이 없어야 함
    • transaction
      • 여러 객체에 대한 여러 작업을 하나의 실행단계로 묶는 기법
    • lost-update problem
      • 하나의 object를 두 개의 writer가 적용될 경우 먼저 적용된 write 유실되는 현상
    • write skew: 두 object가 동시에 변경되며 consistency가 깨지는 현상
  • weak isolation level: 일정 수준 error 허용
    • read committed isolation
      • committed data에 한해 read, overwrite 진행(no dirty read, no dirty write)
      • lost update 해결 불가
      • lock 활용
    • Snapshot Isolation
      • multiversion 활용(MVCC, multi-version concurrency control)
      • consistency 확보에 용이
      • backup, analysis에 활용
      • reader writer는 서로를 block하지 않음
      • lost update 문제를 완전히 해결하지는 못 함
      • write skew 유발
    • lost update 해결법
      • Atomic write operations

        • exclusive lock on object. single thread 작업일 때 주로 사용
        • FOR UPDATE 구문
      • Automatic detecting: lost update 발생 시 abort

      • Compare and set: write 직전 read해서 현상태 확인

        UPDATE item SET value = "new"
        WHERE id = 1234 AND content = "old"
        
        • query 시점에 old여야 new로 set
        • multi leader, leaderless 상황이면 적용 어려움(up-to-date 보장이 안되므로)
      • riak: replica 간 통신을 통해 merge 진행

    • write skew 해결
      • materialized conflicts: 관련된 db row에 lock
        • 코드가 지저분해지고 오류 발생 가능성을 높이므로 가급적 지양
      • Predicate locks
        • 특정 condition을 만족하는 모든 객체에 적용되는 lock(시간 범위 등)
        • 아직 존재하지 않는 객체에도 범위를 통해 lock 적용 가능
        • performance issue
      • index-range locks
        • 검색 범위와 특정 index를 만족하는 경우에만 lock 적용
      • Serial execution
        • actual serial execution: concurrency를 없애버림
          • stored procedure
            • 사람의 판단 등으로 전체 프로세스가 오래 걸리는 경우
            • 여러 query를 저장해두었다가 query processor가 한 번에 실행
        • Two-Phase locking (2PL)
          • reader 끼리는 lock 사용하지 않음. writer-reader, writer-writer간에는 lock
          • read시 우선 shared lock 적용. exclusive lock 존재하면 wait
          • write 시 shared lock을 exclusive로 전환. 타 transaction 진행 불가
          • Pessimistic lock. deadlock 위험성 존재
        • Serializable Snapshot Isolation(SSI)
          • Optimistic concurrency control technique. 우선 진행 후 commit 시점에 확인
            • 타 transaction이 commit을 앞두고 있지는 않은지
            • lost update 등 문제가 발생한다면 abort
            • write이 현재 진행중인 reading transaction에 영향 줄 경우 notify
          • 자원에 여유가 있을 경우 적합
            • retry 자주 발생. 자원이 부족하면 성능 악영향