MyISAM에서는 UPDATE/DELETE할 때 테이블에 lock을 건다.
InnoDB에서는 스캔된 레코드에 대해서 lock이 걸리게 된다.
InnoDB에서는 SELECT...FOR UPDATE때 와 마찬가지로 UPDATE/DELETE에 있어서도
스캔된 레코드 전부에 lock이 걸리게 된다.
인덱스를 가진 컬럼을 WHERE문에 사용해서 스캔되는 행을 한정해야 한다.
●Next-Key Locking
InnoDB에서는 팬텀리드현상이 갱신할 때 발생하기않게 하기 위해서 Next-key Locking이라는 lock을 도입하고 있다. 예를 들어 하나의 레코드를 갱신한다고 치자.
mysql> SELECT a FROM t WHERE b<10;
mysql>UPDATE t SET a=100 WHERE b<10;
이 때, 다른 쓰레드가 b<10조건을 만족하는 레코드를 삽입했다고 하자.
그러면 2개의 레코드가 변경될 가능성이 나오게 된다.
팬텀(환상, 유령) 레코드가 생길 수 밖에 없다.
이것을 방지하기 위해서 InnoDB에서는 레코드를 삽입할려고 하는 다른 스레드를 lock대기시킨다. InnoDB에서는 디폴트로 Next-key Locking이 유효화 되어있다.
이것을 해제하기 위해서는 MySQL 기동할 때 innodb_locks_unsafe_for_binlog옵션을 설정한다.
※MyISAM의 INSERT할 때의 lock
MyISAM에서는 레코드를 추출할 때 테이블에 읽기 전용 lock을 건다.
다만, 테이블 도중에 삭제된 레코드가 없다면 레코드를 추출중에도 레코드 삽입이 가능하다.
(동시 삽입)