2023. 2. 28. 14:57γπΎBackEnd/β DataBase
Lock
- λ½μ κΈ°λ³Έμ μΌλ‘ λμμ±μ 보μ₯νλ€. μ¦. λ½μ λμμ±μ μ μ΄ν λ λ½μ λ²μλ₯Ό μ΅μνλ₯Ό νλκ² μ€μνλ€.
μλνλ©΄ λ½μ λ²μκ° κΈΈμ΄μ§λ©΄ λμ§μ€μΈ 컀λ₯μ μ΄ λ§μμ§κ³ λμ€μλ 컀λ₯μ νμ΄ κ³ κ°λ‘ μ΄μ΄μ§ μ μλ€.
- κΈ°λ³Έμ μΌλ‘ MySQLμμλ νΈλμμ μ»€λ° , λ‘λ°±μμ μ λ½μ΄ νλ¦°λ€.
- νΈλμμ μ΄ κ³§ λ½μ λ²μκ° λλ€κ³ μκ°νλ©΄ λλ€.
- MySQLμμ λ½μ ν¬κ² InnoDB μμ§ , MySQL μμ§ λ λ²¨λ‘ λλ μ μλ€.
π λΉκ΄μ λμμ± μ μ΄(PCC, Pessimistic Concurrency Control)
λΉκ΄μ λ½μ΄λΌκ³ λ νλ©° νΈλμμ μ΄ μΆ©λνλ κ°μ νμ μ κΈμ κ±°λ λ°©μ
- μΌλ°μ μΌλ‘ Shared Lock, Exclusive Lockμ ν΅ν΄ μ΄λ₯Ό ꡬννλ€.
π λκ΄μ λμ μν μ μ΄(OCC, Optimistic concurrency control)
- λκ΄μ λ½μ΄λΌκ³ λ νλ©° νΈλμμ μ΄ μλ‘ μΆ©λνμ§ μλλ€κ³ κ°μ νλ λ°©μ
λ μ½λ μ κΈμ μ¬μ©νμ§ μλ κ΄κ³ν λ°μ΄ν°λ² μ΄μ€μ μ¬μ©λλ λμμ± μ μ΄ λ°©λ²μ΄λ€.
MySQL μμ§μ΄ μ 곡νλ Lock
1. κΈλ‘λ² λ½
Flush Tables with Read Lock
- κ°μ₯ λ²μκ° ν° Lockμ΄λ€.
- λ½μ κ±Έλ©΄ Read, Writeκ° μ€νμ΄ λΆκ°λ₯νλ€.
Flush Tables with Read Lock
μ μ€νμ νλ €λ©΄ κΈ°μ‘΄μ μΏΌλ¦¬κ° λ€ μ€νμ΄ λκ³ κ°λ₯νλ€- λ§μ½μ κΈ΄ select쿼리λ₯Ό μ€ννκ³ μμΌλ©΄ λ½μ μ¬μ©νμ§ λͺ»νλ€.
- λ½μ μ€νν μλ²μμ νμ΄μΌμ§ μΏΌλ¦¬κ° μ€νμ΄ κ°λ₯νλ€.
2. ν μ΄λΈ λ½
- κ°λ³ ν μ΄λΈ λ¨μλ‘ μ€μ λλ μ κΈ
Lock Tables ν μ΄λΈ μ΄λ¦ [Read | Write ]
λ₯Ό νμ¬ Readλ½ or Writeλ½μ μ€μ νλ€.- Read Lockμ λ€λ₯Έ μ¬λλ€μ΄ Insertλ₯Ό νμ§ λͺ»νλ€.
- Write Lockμ λ€λ₯Έ μ¬λμ΄ λ½ μ¬μ©μκ° Insert νκΈ° μ κΉμ§ Selectλ₯Ό νμ§ λͺ»νλ€.
3. λ€μλ λ½
Get_Lock()
μ ν΅νμ¬ μμμ λ¬Έμμ΄μ λν΄ μ κΈμ μ€μ μ΄ κ°λ₯νλ€.
SELECT GET_LOCK('my_lock',2); //λ½μ κ±°λλ° μ΄λ―Έ μ κΈμ΄λ©΄ 2μ΄ λμλ§ λκΈ°
SELECT IS_FREE_LOCK('my_lock');//λ¬Έμμ΄μ΄ μ κΈμ΄ λμλμ§ νμΈ
SELECT RELEASE_LOCK('my_lock');//λ½μ λ°λ© νλ€.
InnoDB μμ μ 곡νλ λ½
Record Locks
- λ μ½λ μ체λ§μ μ κ·Έλ λ½μ΄λ€.
- νΈλμμ μμ λ°μ΄ν°λ₯Ό μ½κ±°λ μμ νλ κ²½μ°μ μ¬μ©λλ€. νΈλμμ Aκ° λ°μ΄ν°λ₯Ό μ½μΌλ©΄ νΈλμμ Bλ ν΄λΉ λ μ½λλ₯Ό μμ νμ§ λͺ»νμ¬ λ°μ΄ν°μ μΌκ΄μ±μ 보μ₯νλ€.
- λ μ½λ λ½μ 곡μ λ½, λ°°νμ λ½μΌλ‘ ꡬλΆνλ€.
곡μ λ½ | μ¬λ¬ κ°μ νΈλμμ μ΄ ν΄λΉ λ μ½λλ₯Ό μ½μ μ μλ€. |
λ°°νμ λ½ | ν΄λΉ λ μ½λλ₯Ό μμ ν νΈλμμ λ§ μμ μ΄λ μμ κ° κ°λ₯νλ€. |
Gap Locks
- λ μ½λμ λ°λ‘ μΈμ ν λ μ½λ μ¬μ΄μ κ°κ²©λ§μ μ κ·Έλ λ½μ΄λ€.
- μ£Όλ‘ λ²μ κ²μμμ μ¬μ©μ΄ λλ€.
- λ μ½λμ λ μ½λ μ¬μ΄μ κ°κ²©μ μλ‘μ΄ λ μ½λκ° μμ±λλ κ²μ μ μ΄νκ³ , λ₯μ€νΈ ν€ λ½μ μΌλΆλ‘ μ¬μ©λλ€.
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50)
);
μ μ ν μ΄λΈμ 1~10μ λ°μ΄ν°κ° μλ€κ³ κ°μ νμ
-- νΈλμμ
1μμ λ²μ κ²μμ μνν©λλ€.
START TRANSACTION;
SELECT * FROM users WHERE id > 5 AND id < 8 FOR UPDATE;
-- νΈλμμ
2μμ id κ°μ΄ 6μΈ λ°μ΄ν°λ₯Ό μ½μ
ν©λλ€.
START TRANSACTION;
INSERT INTO users (id, name) VALUES (6, 'Alice');
μ μ½λλ₯Ό 보면 5~8κΉμ§ κ°λ½μ μ€μ νμκ³ νΈλμμ 2μμ κ°λ½ λ²μμ μλ 6μ μΆκ°λ₯Ό νλ €κ³ νλ€.
μ΄λ κ°λ½μ μν΄ νΈλμμ 2λ λκΈ° μνμ λΉ μ§κ² λλ€.
Next-Key Locks
- λ°μ΄ν°μ μΌκ΄μ±μ 보μ₯νκΈ° μν΄ μ£Όλ‘ InnoDB μ€ν λ¦¬μ§ μμ§μμ κΈ°λ³ΈμΌλ‘ μ¬μ©νλ€.
- μ£Όλ‘ μΈλ±μ€ κ²μμμ μ¬μ©μ΄ λλ€.
- λ μ½λ, κ°λ½μ μ‘°ν©ν κ²μΌλ‘ νΈλμμ μμ μΈλ±μ€λ₯Ό κ²μν λ ν΄λΉ λ μ½λμ λνμ¬ λ€λ₯Έ νΈλμμ μ΄ μμ μ΄λ μμ λ₯Ό μ νμ΄ κ°λ₯νλ€.
- REPEATABLE READ 격리 μμ€μμ ν¬ν 리λλ₯Ό λ°©μ§νκΈ° μν μ κΈμ΄λ€.
μλμ κ°μ ν μ΄λΈμ΄ μλ€κ³ κ°μ νμ
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50)
);
νΈλμμ Aκ° λͺ λ Ήμ΄λ₯Ό μ λ ₯μ νμλ€.
SELECT * FROM users WHERE id = 5 FOR UPDATE;
μ΄λ ν΄λΉ λ μ½λλ λ² νμ λ½μ΄ μ€μ μ΄ λλλ° κ·Έλ¬λ©΄ λ€λ₯Έ νΈλμμ Nμ΄ μμ μ΄λ μμ λ₯Ό νλ €κ³ νλ©΄ λκΈ° μνλ‘ λ³κ²½λλ€. μ΄κ²μ λ°μ΄ν°μ μΌκ΄μ±μ μ μ§ μμΌμ€λ€.
Next-Key Lockμ΄ λ°μνλ μμ μ½λ
-- νΈλμμ
1μμ id κ°μ΄ 5μΈ λ μ½λλ₯Ό λ½(lock)μ μ€μ ν©λλ€.
START TRANSACTION;
SELECT * FROM users WHERE id = 5 FOR UPDATE;
-- νΈλμμ
2μμ id κ°μ΄ 6μΈ λ μ½λλ₯Ό μ½μ
ν©λλ€.
START TRANSACTION;
INSERT INTO users (id, name) VALUES (6, 'Bob');
- IDκ° 5μΈ λ μ½λμ λ½μ μ€μ νλ©΄ ν΄λΉ λ μ½λμ λν Next-Key Lockμ΄ λ°μνλ€.
- νΈλμμ 2κ° idκ° 6μΈ λ μ½λλ₯Ό μ½μ νλ©΄ μΈλ±μ€ κ°μ λν Next-Key Lockμ΄ λ°μνλ€.
- μ¦ IDκ° 5μ μμͺ½ μΈλ±μ€μ λ½μ΄ κ±Έλ¦¬κ² λλ€. → 4,6μ λ½μ΄ κ±Έλ¦°λ€.
AUTO-INC Locks
- AUTO_INCREMENT μΉΌλ¦Όμ΄ μ¬μ©λ ν μ΄λΈμ λμμ μ¬λ¬ λ μ½λκ° INSERTλλ κ²½μ°, κ° λ μ½λλ μ€λ³΅λμ§ μκ³ μ μ₯λ μμλλ‘ μ¦κ°νλ μΌλ ¨λ²νΈ κ°μ κ°μ ΈμΌ νλ€.
- InnoDB λ λ΄λΆμ μΌλ‘ AUTO-INC λ½μ΄λΌκ³ νλ ν μ΄λΈ μμ€μ μ κΈμ μ¬μ©νλ€.
- νΈλμμ κ³Ό κ΄κ³ μμ΄ INSERTλ REPLACE λ¬Έμ₯μμ AUTO_INCREMENT κ°μ κ°μ Έμ€λ μκ°λ§ λ½μ΄ κ±Έλ Έλ€κ° ν΄μ λλ€.
'πΎBackEnd > β DataBase' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
MySQL - μΈλ±μ€ (0) | 2023.02.28 |
---|---|
MySQL - 격리 μμ€ (0) | 2023.02.28 |
MySQL μμ§ μν€ν μ² (0) | 2023.02.10 |