본문 바로가기

MySQL/Lock

(7)
MySQL Lock (5) Gap Locks gap lock은 index record 사이에 lock을 겁니다. 위의 그림처럼 index record에 거는 lock아니라 index record간의 gap에 lock을 걸 기 때문에, 새로운 record가 gap에 추가 되는 것을 방지할 수 있습니다. 실제로 테스트를 진행하면서 동작을 확인해보겠습니다. 먼저, 테스트를 위한 테이블을 생성합니다. CREATE TABLE users ( id INTEGER AUTO_INCREMENT PRIMARY KEY, username VARCHAR(255) UNIQUE NOT NULL, created_at TIMESTAMP DEFAULT NOW() ); INSERT INTO users (username, created_at) VALUES ('Kenton_Kirlin'..
MySQL lock (4) Record Lock record lock은 index record에 대한 lock입니다. 실제로 테스트 데이터로 테스트를 진행해보겠습니다. 먼저, 테스트를 위한 테이블을 생성합니다. CREATE TABLE users ( id INTEGER AUTO_INCREMENT PRIMARY KEY, username VARCHAR(255) UNIQUE NOT NULL, created_at TIMESTAMP DEFAULT NOW() )Engine=InnoDB CHARSET=utf8; INSERT INTO users (username, created_at) VALUES ('Kenton_Kirlin', '2017-02-16 18:22:10.846'), ('Andre_Purdy85', '2017-04-02 17:11:21.417'), ('Ha..
MySQL lock (3) intention lock 이번 포스트에서는 row lock에대해서 더 상세히 살펴보겠습니다. 트랜잭션이 row lock을 획득하게 되면, 동시에 intention lock이라고 하는 것도 획득하게 됩니다. 그런데, 이 intention lock이라고 하는 것은 왜 사용하는 것일까요? intention lock은 테이블 레벨의 lock이고, 트랜잭션에서 테이블의 row 를 조작하기 위해서 S와 X lock중에서 어떤 lock을 사용하고 있는 지를 알려줍니다. itention lock에는 2가지 종류가 있습니다. intention share lock (IS) intention lock이 IS인경우에는 테이블의 row에 접근하는 트랜잭션이 S lock 이라는 의미입니다. intention exclusive lock (IX) inten..
MySQL lock (2) 개별row에 대한 잠금(row lock) 전 포스트에서 테이블에 대한 잠금 처리에 대해서 살펴 보았습니다. 이번에는 lock관련해서 가장흔하게 언급되는 레코드에 대한 잠금 처리를 알아보겠습니다. 흔히 row lock이라고 하는데, shared mode와 exclusive mode각각 동작을 확인해보겠습니다. 먼저, 테스트를 위한 테이블을 생성합니다. CREATE TABLE users ( id INTEGER AUTO_INCREMENT PRIMARY KEY, username VARCHAR(255) UNIQUE NOT NULL, created_at TIMESTAMP DEFAULT NOW() )Engine=InnoDB CHARSET=utf8; INSERT INTO users (username, created_at) VALUES ('Kenton_Kirl..
MySQL Lock Deadlock (1) 기본편 해리포터에 모두가 두려워하는 존재 볼드모트가 있다면, 데이터베이스 세계에서는 Deadlock이 있습니다. 원인은 다양한데, Deadlock은 100%확률로 발생하지도 않지만, 발생하고 나서는 원인을 찾기도 어렵습니다. 실제로 Deadlock이 발생하는 증상을 재현시켜 보겠습니다. 먼저 테스트를 위한 테이터를 입력합니다. CREATE TABLE users ( id INTEGER AUTO_INCREMENT PRIMARY KEY, username VARCHAR(255) UNIQUE NOT NULL, created_at TIMESTAMP DEFAULT NOW() )Engine=InnoDB CHARSET=utf8; INSERT INTO users (username, created_at) VALUES ('Kento..
MySQL lock (1) 테이블에 대한 잠금(table lock) 간단하게 테이블에 대한 S lock과 X lock에 대해서 알아보겠습니다. S는 shared 이고, X는 exclusive 를 의미하는데, 줄여서 많이 사용됩니다. 보통 흔히 S lock과 X lock은 row lock에 대해서 많이 언급됩니다. 하지만, table lock이 매우 이해하기 쉽기 때문에, 먼저 설명하겠습니다. 먼저 테스트용 데이터베이스와 테이블을 생성합니다. create database test_db_210926; use test_db_210926; CREATE TABLE users ( id INTEGER AUTO_INCREMENT PRIMARY KEY, username VARCHAR(255) UNIQUE NOT NULL, created_at TIMESTAMP DEFAULT NOW() )..
MySQL 트랜잭션 이해하기 트랜잭션은 데이베이스에 대한 하나의 조작 단위라고 정의할 수 있습니다. 데이터베이스에 대한 조작을 트랜잭션 단위로 관리해서, 여러 사용자가 같은 데이터에 대해서 동시에 복수의 읽기나 변경작업을 관리할 수 있게 됩니다. 하지만, 트랜잭션으로 관리해도 문제가 남아있습니다. Dirty read Read중에 Update하는 경우입니다. 데이터 일부가 잘못되는 Dirty read가 일어날 수 있습니다. 가령, Update 중에 rollback이 되는 데이터를 Read한 경우가 이에 해당합니다. 트랜잭션 1 트랜잭션 2 비고 start transaction; start transaction; Update x, old value x = 1, new value x = 2 Read x, x = 2 (dirty read)..