table lock
β’
κ°λ³ ν
μ΄λΈ λ¨μλ‘ μ€μ λκ³ λͺ
μμ , 묡μμ μΌλ‘ λ½μ νλ
β’
InnoDB ν
μ΄λΈμ κ²½μ° μ€ν λ¦¬μ§ μμ§ μ°¨μμμ λ μ½λ κΈ°λ° μ κΈ μ 곡 -> λ¨μ λ°μ΄ν° λ³κ²½ μΏΌλ¦¬λ‘ μΈν΄ 묡μμ ν
μ΄λΈ λ½ μ€μ X, DDL κ²½μ°μλ§ ν
μ΄λΈ λ½ μ€μ
# session 1
lock tables morak.appointment read;
# session 2
select * from morak.appointment;
# μ±κ³΅
update morak.appointment set status='OPEN' where id=1;
# λκΈ°μ€
# session 1
unlock tables;
# update 쿼리 μ€ν
SQL
볡μ¬
# session 1
lock tables morak.appointment write;
# session 2
update morak.appointment set status='OPEN' where id=1;
# λκΈ°μ€
select * from morak.appointment;
# λκΈ°μ€
# session 1
unlock tables;
#쿼리 μ€ν
SQL
볡μ¬
named lock
β’
get_lock() ν¨μλ₯Ό μ΄μ©ν΄ μμμ λ¬Έμμ΄μ λν΄ μ κΈ μ€μ
β’
ν
μ΄λΈ, λ μ½λ λ±μ κ±°λ κ²μ΄ μλλΌ νΉμ λ¬Έμμ΄μ λν΄ μ κΈ
β’
8.0 λΆν° μ€μ²©ν΄μ μ¬μ© κ°λ₯
# was λΌλ μ΄λ¦μ λ½μ νλ, λ½μ΄ μ΄λ―Έ μμΌλ©΄ 2μ΄λ§ λκΈ°
select get_lock('was', 2);
# was λΌλ μ΄λ¦μ λ½μ΄ free νμ§ νμΈ 0μ΄λ©΄ X, 1μ΄λ©΄ O
select is_free_lock('was');
# was λΌλ μ΄λ¦μ λ½ ν΄μ
select release_lock('was');
SQL
볡μ¬
β’ λΆμ° νκ²½μμ μ¬μ©, μμ²μ λν key κ°μΌλ‘ ν΄μ κ°λ₯
metadata lock
β’
μ λͺ¨λ₯΄κ² λ€. μ‘°κΈ λ 곡λΆν λ€μ λ€μ 보μ
InnoDB μ€ν λ¦¬μ§ μμ§ μ κΈ
β’
μ€ν λ¦¬μ§ μμ§ λ΄λΆμμ λ μ½λ κΈ°λ°μ μ κΈ λ°©μ νμ¬
β’
λμμ± μ²λ¦¬ κ°λ₯
β’
information_schema μ performance_schema λ‘ μ κΈ νμΈ κ°λ₯
record lock
β’
λ μ½λ μμ²΄κ° μλ μΈλ±μ€μ λ μ½λλ₯Ό μ κΈ
β’
μΈλ±μ€κ° νλλ μλ ν
μ΄λΈλ λ΄λΆμ μΌλ‘ μλ μμ±λ ν΄λ¬μ€ν°λ μΈλ±μ€λ₯Ό μ΄μ©ν΄ μ κΈ μ€μ
β’
PK λλ unique μΈλ±μ€μ μν λ³κ²½ μμ
μμλ λ μ½λμ λ½
gap lock
β’
λ μ½λμ λ°λ‘ μΈμ ν λ μ½λ μ¬μ΄μ κ°κ²©λ§μ μ κΈ
β’
λ μ½λμ λ μ½λ μ¬μ΄μ κ°κ²©μ μλ‘μ΄ λ μ½λκ° μμ±λλ κ²μ μ μ΄
β’
λ₯μ€νΈ ν€ λ½μ μΌλΆλ‘ μμ£Ό μ¬μ©
next key lock
β’
λ μ½λ λ½ + κ° λ½
β’
λ°μ΄λ리 λ‘κ·Έμ κΈ°λ‘λλ μΏΌλ¦¬κ° λ ν리카 μλ²μμ μ€νλ λ μμ€ μλ²μμ λ§λ€μ΄ λΈ κ²°κ³Όμ λμΌν κ²°κ³Όλ₯Ό λ§λ€μ΄λ΄λλ‘ λ³΄μ₯νλ κ²μ΄ μ£Όλͺ©μ
β’
λ°λλ½, λ€λ₯Έ νΈλμμ
λκΈ° μν μμ£Ό λ°μ
β’
λ°μ΄λ리 λ‘κ·Έ ν¬λ§·μ ROW ν¬λ§· ννλ‘ λ°κΏμ λ₯μ€νΈ ν€ λ½μ΄λ κ° λ½μ μ€μ΄λ κ²μ΄ μ’μ
β¦
statement ν¬λ§·μ λ°μ΄λ리 λ‘κ·Έκ° κ°μ§λ λ¨μ μ λ§μ΄ ν΄κ²°ν΄μ€ μ μμ΄μ MySQL 8.0 μμλ ROW ν¬λ§·μ λ°μ΄λ리 λ‘κ·Έκ° κΈ°λ³Έ μ€μ
auto increment lock(μλ μ¦κ° λ½)
β’
auto increment λ₯Ό μν ν
μ΄λΈ μμ€μ μ κΈ
β’
insert, replace κ°μ μλ‘μ΄ λ μ½λλ₯Ό μ μ₯νλ 쿼리μμλ§ νμ, update, delete μμλ λ½ X
β’
νΈλμμ
κ³Ό κ΄κ³μμ΄ insert, replace λ¬Έμ₯μμ auto increment κ°μ κ°μ Έμ€λ μκ°λ§ λ½μ΄ κ±Έλ Έλ€κ° ν΄μ
β’
μ§κΈκΉμ§ MySQL 5.0 μ΄ν λ°©μ
β’
5.1 μ΄μλΆν°λ innodb_auto_inc_lock_mode λ³μλ₯Ό μ΄μ©νμ¬ μλ λ°©μ λ³κ²½ κ°λ₯
β¦
8.0 λΆν°λ innodb_auto_inc_lock_mode=2 κ° κΈ°λ³Έ -> λ°μ΄λ리 λ‘κ·Έ ν¬λ§·μ΄ STATEMENT μμ ROW λ‘ κΈ°λ³Έκ°μ΄ λ³κ²½λμκΈ° λλ¬Έ
index μ μ κΈ
β’
λ³κ²½ν΄μΌ ν λ μ½λλ₯Ό μ°ΎκΈ° μν΄ κ²μν μΈλ±μ€μ λ μ½λλ₯Ό λͺ¨λ λ½μ 건λ€
μΈλ±μ€ 리ν λ
Έλ
city | id |
daejeon | 5 |
dongtan | 6 |
seoul | 1 |
seoul | 2 |
seoul | 4 |
ulsan | 3 |
ν
μ΄λΈ
id | name | city |
1 | eden | seoul |
2 | ellie | seoul |
3 | winnie | ulsan |
4 | kkara | seoul |
5 | chalee | daejeon |
6 | albur | dongtan |
# session 1
start transaction;
update member set name='eden2' where id=1;
# id = 1 μ λ μ½λ λ½
# city = seoul μ λ μ½λ λ½
# session 2
update member set name='eden2' where id=1;# λκΈ°
update member set name='eden2' where city='seoul';
# λκΈ°
update member set name='eden2' where name='ellie';
# λκΈ°
update member set name='eden2' where id=2;
# complete
update member set name='eden2' where city='ulsan';
# complete
SQL
볡μ¬
β’
μΈλ±μ€κ° μλ€λ©΄ ν
μ΄λΈ ν μ€μΊνλ©΄μ update μμ
-> λͺ¨λ λ μ½λκ° μ κΉ
β’
where 쑰건μ 컬λΌμΌλ‘ A, B κ° μκ³ A λ§ index κ° κ±Έλ € μμΌλ©΄ B λ‘ μΈν μ 체 λ μ½λ μ κΈμ μΌμ΄λμ§ μλλ€.
β’
performance_schema μ data_locks ν
μ΄λΈλ‘ νμΈ κ°λ₯
β¦
lock_mode column
βͺ
IX -> Internal eXclusive
βͺ
REC_NOT_GAP -> κ°μ΄ ν¬ν¨λμ§ μμ μμ λ μ½λ μ κΈ