아래는 MySql을 적극 사용하고 있는 기업들이다.

왜 MySql을 선택했을까?
트랜잭션은 데이터를 조작하는 하나의 단위라고 생각하면 된다.
즉, 트랜잭션은 모든 작업 셋이 완벽하게 처리 되거나(commit) 처리가 되지 못하면 복구(rollBack)를 함으로서 작업의 완전성을 보장한다.
noSql은 이 부분이 약하다.
MySql은 디폴트로 auto commit이 설정되어있어 조작할 때마다 자동으로 commit을 해준다.
물론 auto_commit을 풀 수도 있다.
** DDL문(CREATE, DROP, ALTER, RENAME, TRUNCATE)은 transaction의 rollback 대상이 아니다.

활동이란 트랜잭션이 실행 중을 의미한다.
트랜잭션이 다른 트랜잭션의 영향을 얼마나 받을 건지 정하는 것을 격리수준이라고 한다.

READ UNCOMMITTED
READ UNCOMMITTED는 트랜잭션이 commit되거나 rollback여부를 상관하지 않고 다른 트랜잭션에게 노출된다.
커밋되지 않은 데이터가 읽하는 것을 dirty read라고 한다.
그러므로 정확한 데이터를 사용하기위해선 READ UNCOMMITTED이상의 격리 수준을 사용하는 것이 좋다.
READ COMMITTED
커밋된 데이터만 보이는 격리수준이다.
dirty read는 해소가 되었지만 특정 상황에서는 부정합 문제가 일어날 수 있다.
트랜잭션이 성공했지만 커밋되기 전의 부분완료상태일때, 다른 트랜잭션이 데이터를 조회하면 커밋되기 전 undo 영역의 값을 읽어오게 된다.
즉, 갱신되지 않은 값이 조회된다.
해당 트랜잭션이 commit을 하면 undo영역에 새롭게 변경된 값이 백업되어 변경된 값을 읽어올 수 있다.
REPEATABLE READ
REPEATABLE READ는 READ COMMITTED의 부정합 문제가 일어나지 않는다.
값이 변경되기 전 DB 스냅샷을 백업해두어 트랜잭션 도중 다른 트랜잭션이 커밋되더라도 백업해둔 스냅샷을 사용하기 때문에 새로 커밋된 값을 읽지 않을 수 있다. 이를 MVCC라고 하며 백업해둔 데이터를 이용해 동일 트랜잭션에선 동일한 값이 나오는 것을 보장한다.
SERIALIZABLE
가장 엄격한 격리 수준이다.
쓰거나 수정은 물론이고 읽는 작업이 실행중일때도 다른 트랜잭션은 접근 할 수 없다.

데이터의 읽기 쓰기를 담당한다.
스토리지 엔진에 따라 MySQL데이터를 읽고 쓰는 방법이 정해진다.
MySQL의 디폴트 스토리지 엔진은 InnoDB이다.
유용한 명령어
SHOW CREATE TABLE
테이블이 어떻게 생성되었는지 보여주는 명령어
ORM으로 생성한 테이블의 경우 어떤식으로 만들어졌는지 궁금하다면 유용하다.
charset
어떤 character(문자열)의 데이터를 저장할지 정한다.
collate
저장된 데이터를 어떤식으로 비교, 정렬 할지 정한다.
데이터베이스 락을 짧게 설명하자면 동시성을 제어하기 위한 기능이라고 할 수 있다.
그럼 동시성은 무엇인가?
여러명이 같은 데이터를 요청할 경우, 한 시점에는 하나의 커넥션만 변경되어야한다.
즉, 동시성은 하나의 데이터를 동시에 여러명이 조작할 수 없도록 방어 하는 것이다.
데이터베이스 동시성을 보장받지 못하는 경우 발생하는 에러를 해결하기 위한 방안으로는 락이있다.
범위가 가장 넓다.
SELECT 를 제외한 모든 쿼리들이 대기상태로 남는다.
서버 전체에 영향을 미친다.
작업 대상이나 테이블이 다르더라도 동일하게 영향을 준다.
mysqldump로 백업을 받아야하는 경우에 사용한다.
데이터베이스를 전반적으로 업데이트 한다면 다른 작업들이 종료되어야 함
특정 테이블에 대한 lock
글로벌 락과 동일하게 다른 작업에 영향을 미치기 때문에 사용할 일이 빈번하지는 않다고 한다.
테이블에 데이터를 변경하는 쿼리를 실행하면 자동으로 발생
- 데이터 추가 시 lock 설정
- 데이터 변경
- 데이터 변경 commit 시 lock release
InnoDB의 경우에는 DML 쿼리에서는 lock이 작동하지 않고 DDL의 경우에만 영향을 미친다. (스토리지 엔진의 구조의 차이 때문)
READ LOCK
lock table [테이블] READ
- 데이터를 읽기 위해 테이블을 잠근다 (= Share Lock)
- 쓰기 작업 수행 불가
- 쓰기 작업을 수행 중인 경우 Lock이 release 될 때까지 대기한다.
show processlist로 대기 중 세션 확인
WRITE LOCK
lock table [테이블] WRITE
- 데이터를 쓰기 위해 테이블을 잡근다. (= Exlcusive Lock)
- 읽기 작업 수행 불가
GET_LOCK()이라는 명령어로 임의의 문자열에 대해 잠금을 설정