home

트랜잭션

  • 요즘에는 여러 사용자가 데이터베이스를 사용한다.

잠금(락)

  • 데이터베이스 서버가 데이터 자원의 동시 사용을 제어하는 데 사용하는 메커니즘
    • 쓰기잠금, 읽기잠금
    • 버전관리: writer는 잠금, reader는 락이 없으나 쿼리 시작부터 끝날 때까지 일관된 보기를 제공
  • 장단점이 있는데 첫번째는 대기 시간 길어짐, 두번째는 데이터를 수정 동안 오래 실행되는 쿼리가 있으면 문제
  • 잠금단위: 테이블 락, 페이지 락(2kb, 16kb 범위의 메모리 세그먼트), 행 락

트랜잭션

  • 여러 SQL 문을 함께 그룹화해서 모든 구문이 성공하거나 성공하지 않도록 하는 장치
  • DB서버는 트랜잭션 중간에 서버가 종료됐다가 다시 온라인이 되면 불안전한 트랜잭션을 찾아 롤백시킨다.
  • 또한 트랜잭션 후 commit을 했지만 스토리지에 적용이 되기 전에 서버가 종료되면, 다시 서버가 시작될 때 트랜잭션의 변경 사항을 적용해야 한다ㅣ(지속성)

트랜잭션 시작

  • 하나는 항상 세션이 연결되어 있어서 트랜잭션 하나 끝나면 자동으로 다른 트랜잭션 시작 -> 시작 필요 X
  • 트랜잭션을 시작하지 않으면 개별 SQL 문은 독립적으로 자동 커밋 -> 시작 명령어 실행해야함
  • 그런데 자동 커밋은 좋지 않다. 꺼라

트랜잭션 종료

  • commit을 사용하면 저장하고 트랜잭션 해제
  • 되돌리려면 rollback 사용
  • 그 이외의 상황
    1. 서버가 종료되고 재시작되면 이전 트랜잭션이 커밋
    2. alter table과 같은 SQL 스키마 문을 실행하면 현재 트랜잭션이 커밋, 새로운 트랜잭션 시작
    3. 다른 start transaction 명령어가 실행되면 이전 트랜잭션 커밋
    4. 교착상태 감지시 해당 트랜잭션이 문제라고 판단되면 서버는 트랜잭션을 조기 종료 ㅈㅈ

      트랜잭션 세이브 포인트

  • 전체 롤백 말고 특정 작업까지 save 할 수 있다.
  • SAVEPOINT my_savepoint;로 생성 가능
  • ROLLBACK TO SAVEPOINT my_savepoint;로 롤백 가능

스토리지 엔진 선택

  • 리소스 잠금과 트랜잭션 관리를 포함한 낮은 수준의 데이터베이스 기능을 제공하기 위해 여러 스토리지 엔진 제공
    • MyISAM: 테이블 잠금을 사용하는 넌트랜잭션 엔진
    • MEMORY: 인메모리 테이블에 사용되는 넌트랜잭션 엔진
    • CSV: 데이터의 쉼표로 구분해서 파일에 저장하는 트랜잭션 엔진
    • InnoDB: 행 수준 잠금을 사용하는 트랜잭션 엔진
    • Merge: 여러 개의 MyISAM 테이블을 단일 테이블로 표시하는 특수 엔진
    • Archive: 주로 보관 목적으로 대량의 인덱싱되지 않은 데이터를 저장하는 특수 엔진
  • Mysql은 테이블별로 스토리지 엔진을 선택할 수 있다.
  • 그러나 트랜잭션을 사용하는 테이블의 경우 행 수준 잠금 및 버전 관리를 제공하는 InnoDB 엔진을 선택해야함