-
(1) ํธ๋์ญ์ ์ด๋
-
(2) ํธ๋์ญ์ ์ 4๊ฐ์ง ํน์ฑ (ACID)
-
(2-1) Atomicity (์์์ฑ)
-
(2-2) Consistency (์ผ๊ด์ฑ)
-
(2-3) Isolation (๊ฒฉ๋ฆฌ์ฑ)
-
(2-4) Durability (์ง์์ฑ)
-
(1) ๊ฒฉ๋ฆฌ์ฑ์ผ๋ก ์ธํด ๋ฐ์ํ ์ ์๋ ๋ฌธ์
-
(1-1) Dirty Read
-
(1-2) Non-Repeatable Read
-
(1-3) Phantom Read
-
(2) DB์์ ์ง์ ํ ์ ์๋ ๊ฒฉ๋ฆฌ์ฑ ์์ค [๊ฒฉ๋ฆฌ์ฑ ์ ๊ทผ ๋ ๋ฒจ]
-
(2-1) Read Uncommitted - ์ปค๋ฐ๋์ง ์๋ ๊ฒ์ ์ฝ์
-
(2-2) Read Committed - ์ปค๋ฐ๋ ๊ฒ์ ์ฝ์
-
(2-3) Repeatable Read โ ๋ฐ๋ณต์ ์ผ๋ก ์ฝ์
-
(2-4) Serializable Read - ์ง๋ ฌํ๊ฐ ๊ฐ๋ฅ (์ฌ๋ฌ ํธ๋์ญ์ ์ด ์ค์์ ๊ธฐ๋ค๋ฆฌ๋ฉฐ ํ๋์ฉ ์ฒ๋ฆฌ๋จ)
1) ํธ๋์ญ์
(1) ํธ๋์ญ์ ์ด๋
- DB ์์์ ํธ๋์ญ์ ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ํํ๋ ์์ ์ ๋ ผ๋ฆฌ์ ์ธ ๋จ์๋ฅผ ๋งํ๋ฉฐ, ํ๋์ ํธ๋์ญ์ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ผ๋ จ์ ์์ ๋ค์ ํฌํจํ๋ฉฐ ์ด๋ฌํ ์์ ๋ค์ ๋ชจ๋ ์ฑ๊ณต์ ์ผ๋ก ์ํ๋๊ฑฐ๋ ์คํจํด์ผ ํ๋ค. โ All or Nothing ์ ๋ต
(2) ํธ๋์ญ์ ์ 4๊ฐ์ง ํน์ฑ (ACID)
- DB์์์ ํธ๋์ญ์ ์ ์๋์ 4๊ฐ์ง ํน์ฑ์ ์ง๋๋ค.
(2-1) Atomicity (์์์ฑ)

- ํธ๋์ญ์ ์ ๋ ผ๋ฆฌ์ ์ผ๋ก ํ๋์ ์คํ ๋จ์์ฌ์ผ ํ๊ณ ๋ฌผ๋ฆฌ์ ์ผ๋ก ์ฌ๋ฌ ๊ฐ์ Statement๋ก ๊ตฌ์ฑ๋์ด ์๋ค ํ๋๋ผ๋ ๋ ผ๋ฆฌ์ ์ธ ๋จ์๋ก ๋ฌถ์ผ ์ ์์ด์ผ ํ๋ค.
- ํ๋์ ์คํ ๋จ์๋ผ๋ฉด ๋ ๊ฐ์ ์ํ๋ก ๊ท๊ฒฐ๋๋๋ฐ, ์ฑ๊ณตํ๊ฑฐ๋ ๋๋ ์คํจํ๊ฑฐ๋์ด๋ค. (All or Nothing)
- ์ฆ, ์ฌ๋ฌ ๊ฐ์ Statement๋ก ์์ฑ๋์๋ค ํ๋๋ผ๋ ํ๋์ ํธ๋์ญ์ ์ผ๋ก ๋ฌถ์ธ๋ค๋ฉด ํ ํธ๋์ญ์ ๋ด์์ ์คํํ ์์ ๋ค์ ํ๋์ ์์ ์ผ๋ก ๊ฐ์ฃผํ๊ณ ๋ชจ๋ ์ฑ๊ณต ๋๋ ์คํจ๋์ด์ผ ํ๋ค๋ ๊ฒ์ด๋ค. (๋ถ๋ถ ์ฑ๊ณต / ๋ถ๋ถ ์คํจ ์์)
(2-2) Consistency (์ผ๊ด์ฑ)

- ํธ๋์ญ์ ์ ์์ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ ํญ์ ์ผ๊ด์ฑ์ด ์์ด์ผ ํ๋ฉฐ, ํธ๋์ญ์ ์ด ์งํ๋๋ ๋์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๋ณ๊ฒฝ๋๋๋ผ๋ ์ ๋ฐ์ดํธ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ํธ๋์ญ์ ์ด ์งํ๋๋ ๊ฒ์ด ์๋๋ผ, ์ฒ์์ ํธ๋์ญ์ ์ ์งํํ๊ธฐ ์ํด ์ฐธ์กฐํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ์งํ๋๋ค.
(2-3) Isolation (๊ฒฉ๋ฆฌ์ฑ)

- ๋ ์ด์์ ํธ๋์ญ์ ์ด ๋์์ ์คํ๋๊ณ ์์ ๊ฒฝ์ฐ, ์ด๋ค ํ๋์ ํธ๋์ญ์ ์ด๋ผ๋ ๋ค๋ฅธ ํธ๋์ญ์ ์ ์ฐ์ฐ์ ๋ผ์ด๋ค ์ ์๋ค.
- ์ํ ์ค์ธ ํธ๋์ญ์ ์ ์์ ํ ์๋ฃ๋ ๋๊น์ง ๋ค๋ฅธ ํธ๋์ญ์ ์์ ์ํ ๊ฒฐ๊ณผ๋ฅผ ์ฐธ์กฐํ ์ ์๋ค.
โ ์ฆ, ๋์์ ์คํ๋๋ ํธ๋์ญ์ ๋ค์ด ์๋ก ์ํฅ์ ๋ฏธ์น์ง ์๋๋ก ๊ฒฉ๋ฆฌํ๋ค๋ ๊ฒ์ด๋ค.
(2-4) Durability (์ง์์ฑ)
- ํธ๋์ญ์ ์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋์์ ๊ฒฝ์ฐ, ๊ทธ ๊ฒฐ๊ณผ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์์ ์ผ๋ก ์ ์ฅ, ๋ฐ์๋์ด์ผ ํ๋ค. (COMMIT)
- ๋น๋ก ํธ๋์ญ์ ์ด ์คํจ๋๋๋ผ๋ ๊ทธ ์ํ๊ฐ ์ผ๊ด๋๊ฒ ์ ์ง๋์ด์ผ ํ๋ค. (ROLLBACK)
2) ํธ๋์ญ์ ๊ฒฉ๋ฆฌ์ฑ (Transaction Isolation)
- ํธ๋์ญ์ ์ ํน์ฑ ์ค ๊ฒฉ๋ฆฌ์ฑ์ ๋ํด ์์ธํ๊ฒ ์์๋ณด์!
- ์์์ ์ดํด๋ณด์๋ฏ์ด, ๊ฒฉ๋ฆฌ์ฑ์ โ์คํ ์ค์ธ ํธ๋์ญ์ ์ ์ค๊ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ค๋ฅธ ํธ๋์ญ์ ์ด ์ ๊ทผํ ์ ์๋ค.โ๋ผ๊ณ ํ์์ผ๋ ๋ง์ฐํ๊ฒ ์ ๊ทผํ ์ ์๋ค๋ผ๊ธฐ ๋ณด๋ค๋ ์ผ๋ฐ์ ์ผ๋ก ์ ๊ทผ ๋ ๋ฒจ์ด ์กด์ฌํ๊ณ DB์ ๋ฐ๋ผ ์ค์ ์ด ๊ฐ๋ฅํ๋ค.
- ์ด๋ฌํ ๊ฒฉ๋ฆฌ์ฑ ์ ๊ทผ ๋ ๋ฒจ์ ๊ฐํ๊ฒ ์ฒ๋ฆฌํ ์๋ ์๊ณ ๋ฐ๋๋ก ์ฝํ๊ฒ ์ฒ๋ฆฌํ ์๋ ์๋ค.
- ์ผ๋จ ๊ฒฉ๋ฆฌ์ฑ์ผ๋ก ์ธํด ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ์ ์ ๋จผ์ ์ดํด๋ณธ ๋ค์ ๊ฒฉ๋ฆฌ์ฑ ์ ๊ทผ ๋ ๋ฒจ์ ์์๋ณผ ์์ ์ด๋ค.
(1) ๊ฒฉ๋ฆฌ์ฑ์ผ๋ก ์ธํด ๋ฐ์ํ ์ ์๋ ๋ฌธ์
- ๊ฒฉ๋ฆฌ์ฑ์ผ๋ก ์ธํด ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ๋ ์ผ๋ฐ์ ์ผ๋ก Dirty Read, Non-Repeatable Read, Phantom Read 3๊ฐ์ง์ด๋ค.
(1-1) Dirty Read

Dirty Read๋ ๋ค๋ฅธ ํธ๋์ญ์ ์ ์ํด ์์ ๋์ง๋ง ์์ง ์ปค๋ฐ๋์ง ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋ ๊ฒ์ ๋งํ๋ค.
- ๋ง์ฝ, Transaction_1์ด ์ ์์ฒ๋ฆฌ๋์ง ์๊ณ Rollback ๋ ์๋ ์๋๋ฐ ์ด๋ฐ ๊ฒฝ์ฐ, ๊ทธ ๊ฐ์ ์ด๋ฏธ ์ฝ์ Transaction_2๋ ์๋ชป๋ ๊ฐ์ ๊ฐ์ง๊ณ ๋ณธ์ธ์ ๋ก์ง์ ์ฒ๋ฆฌํ๋ ์ํ์ ๋์ด๊ฒ ๋๋ค.
- ์ฆ, Transaction_2๋ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ด ๊นจ์ง ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค๋ ๊ฒ์ด๋ค.
(1-2) Non-Repeatable Read

Non-Repeatable Read๋ ํ ํธ๋์ญ์ ๋ด์์ ๊ฐ์ Key๋ฅผ ๊ฐ์ง Row๋ฅผ ๋ ๋ฒ Read ํ์๋๋ฐ ๊ทธ ์ฌ์ด์ ๊ฐ์ด ๋ณ๊ฒฝ๋๊ฑฐ๋ ์ญ์ ๋์ด ๊ฒฐ๊ณผ๊ฐ ๋ค๋ฅด๊ฒ ๋ํ๋๋ ํ์์ ๋งํ๋ค.
- ์ฆ, Transaction_2์์ ํน์ Row๋ฅผ 2๋ฒ Read ํ๋๋ฐ ๊ทธ ์ฌ์ด์ Transaction_1์ด ํด๋น Row๋ฅผ Updateํ๊ฑฐ๋ Delete ํ์ Commit ํ๊ฒ ๋์ด Transaction_2์์ ๋ค์ Read ํ์์ ๋, ๊ฐ์ด ๋ค๋ฅด๊ฒ ๋์ค๋ ๊ฒ์ด๋ค.
(1-3) Phantom Read

ํ ํธ๋์ญ์ ๋ด์์ ๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฒ ์ํํ์๋๋ฐ, ์ฒซ ๋ฒ์งธ ์ฟผ๋ฆฌ์์ ์๋ ์ ๋ น ๋ ์ฝ๋ (Phantom Record)๊ฐ ๋ ๋ฒ์งธ ์ฟผ๋ฆฌ์์ ๋ํ๋๋ ํ์์ ๋งํ๋ค.
- ์ฆ, Transaction_2๊ฐ ํน์ ์กฐ๊ฑด์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ์ป์์ผ๋ ์ด ๋, ๋ค๋ฅธ Transaction_1์ด ํด๋น ์กฐ๊ฑด์ ๋ฐ์ดํฐ ์ผ๋ถ๋ฅผ ์ถ๊ฐ/์ญ์ ํ๊ณ Commit ํ๊ฒ ๋์ด ์์ง ๋๋์ง ์์ Transaction_2๊ฐ ํด๋น ์กฐ๊ฑด์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ฉด Transaction_1์์ ์ถ๊ฐ/์ญ์ ํ ๋ฐ์ดํฐ๊ฐ ํจ๊ป ์กฐํ/๋๋ฝ ๋๋ค๋ ๊ฒ์ด๋ค.
- Phantom Read์ Non-Repeatable Read๋ฅผ ํท๊ฐ๋ฆด ์ ์๋๋ฐ Non-Repeatable Read๋ 1๊ฐ์ Row์ ๋ฐ์ดํฐ์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ ๊ฒ์ด๋ฉฐ (Update ๋๋ Delete), Phantom Read๋ ๋ค์์ ๊ฑด์ ์์ฒญํ๋ ๊ฒ์ ๋ํด์ ๋ฐ์ดํฐ์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ ๊ฒ์ด๋ค.
(2) DB์์ ์ง์ ํ ์ ์๋ ๊ฒฉ๋ฆฌ์ฑ ์์ค [๊ฒฉ๋ฆฌ์ฑ ์ ๊ทผ ๋ ๋ฒจ]
- ๊ทธ๋ ๋ค๋ฉด ์ด์ DataBase์์ ์ ๊ณตํ๋ ๊ฒฉ๋ฆฌ์ฑ ์์ค (Transaction Isolation Level)์ ๋ํด์ ์์๋ณด์.
- ANSI/ISO SQL ํ์ค(SQL92)์์๋ ํธ๋์ญ์ ์ ๊ฒฉ๋ฆฌ์ฑ๊ณผ ๋์ ์ฒ๋ฆฌ ์ฑ๋ฅ ์ฌ์ด์ Trade-Off๋ฅผ ๋๊ณ ๊ฒฉ๋ฆฌ์ฑ ์ ๊ทผ ๋ ๋ฒจ์ 4๋จ๊ณ๋ก ๋๋์๋ค.
- ๊ฒฉ๋ฆฌ ์์ค์ด ๋์์ง ์๋ก ์์์ ์ธ๊ธํ๋ ๊ฒฉ๋ฆฌ์ฑ์ผ๋ก ์ธํ ์ด์๋ ์ ๊ฒ ๋ฐ์ํ์ง๋ง ๋์ ์ฒ๋ฆฌ ์ฑ๋ฅ์ ๋จ์ด์ง๊ฒ ๋๋ค. (Trade-Off ๊ด๊ณ)
- ๋ํ, ํธ๋์ญ์ ์ด ๋ฐ์ํ๊ฒ ๋๋ฉด DB ๋ด๋ถ์ ์ผ๋ก DB ๋ฝ(DB Lock)์ด ๊ฑธ๋ฆฌ๊ฒ ๋๋๋ฐ ๋ฝ์ ๋ํด์๋ ๋ท ๋ถ๋ถ์์ ๋ค๋ฃฐ ์์ ์ด๋ค.
- ์ฐธ๊ณ ๋ก DBMS ์ ํ๋ง๋ค ๋ด๋ถ์ ์ผ๋ก ๊ฒฉ๋ฆฌ์ฑ ์ ๊ทผ ์์ค or Lock ๋ฉ์ปค๋์ฆ์ ๋ค๋ฅผ ์ ์์ผ๋ฏ๋ก ํ์ํ ์, ํด๋น DB์ Document ๋ฌธ์๋ฅผ ์ฝ์ด๋ณด์
- ํด๋น ๋ด์ฉ์ MySQL์ ํตํด ์ค์ตํ ๊ฒ์ด๋ฏ๋ก ์๋์ SQL์ ํตํด ์ค์ต์ฉ ํ ์ด๋ธ์ ์์ฑํ๊ณ , ์ฉ์ดํ ์ค์ต์ ์ํด ๋ณ๋์ ์ ์ฝ ์กฐ๊ฑด์ ์ค์ ํ์ง ์๋๋ค.
// ํ
์ด๋ธ ์์ฑ
CREATE TABLE EMP (
ID INT not null auto_increment,
NAME VARCHAR(100) not null,
JOB VARCHAR(30) not null,
primary key (ID));
// ์ด๊ธฐ ๋ฐ์ดํฐ ์์ฑ
insert into EMP values (1, "userA", 'Student');
insert into EMP values (2, "userB", 'Student');
insert into EMP values (3, "userC", 'Student');
[์ฐธ๊ณ ] ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค ์กฐํ ๋ฐ ์์ (MariaDB)

// ํธ๋์ญ์
๊ฒฉ๋ฆฌ ์์ค ์กฐํ
show variables like 'tx_isolation';
// ํธ๋์ญ์
๊ฒฉ๋ฆฌ ์์ค ์์
set tx_isolation = 'READ-UNCOMMITTEDโ
// Autocommit ์ค์ ๊ฐ ํ์ธ
show variables like 'autocommit%';
// Autocommit ๋๊ธฐ
SET AUTOCOMMIT = FALSE
- ์ถ๊ฐ์ ์ผ๋ก ๊ฒฉ๋ฆฌ์ฑ ์์ค ์ค์ต์ ์ํด ๋ฏธ๋ฆฌ DB ์ธ์ ์ 2๊ฐ ์ฐ๊ฒฐํด๋๋๋ก ํ๊ณ Autocommit ๊ธฐ๋ฅ์ ๋๋๋ก ํ๋ค.
(2-1) Read Uncommitted - ์ปค๋ฐ๋์ง ์๋ ๊ฒ์ ์ฝ์
ํธ๋์ญ์ ์์ ์ฒ๋ฆฌ ์ค์ธ, ์์ง ์ปค๋ฐ๋์ง ์์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฅธ ํธ๋์ญ์ ์ด ์ฝ๋ ๊ฒ์ ํ์ฉํ๋ค.
- ์ฆ, ์ปค๋ฐํ์ง ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ์ ์๋ค๋ ๊ฒ์ด๋ค.
- ๋ฐ์ ๋ฌธ์ ์ : Dirty Read, Non-Repeatable Read, Phantom Read
- ํด๋น ์ค์ ์ ์ ํฉ์ฑ์ ๋ฌธ์ ๊ฐ ์๊ธฐ ๋๋ฌธ์ ๊ถ์ฅํ๋ ์ค์ ์ ์๋์ง๋ง ๋ค๋ฅธ ๊ฒฉ๋ฆฌ์ฑ ์์ค์ ๋นํด ๋์ ์ฒ๋ฆฌ ์ฑ๋ฅ์ ๊ฐ์ฅ ๋๋ค.
- ์ฐธ๊ณ ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋ ์ธ ๋ ๋ด๋ถ์ ์ผ๋ก Lock์ด ์ฌ์ฉ๋๋ฉฐ DBMS ๋ง๋ค ์ฌ์ฉ๋๋ Lock ๋ฉ์ปค๋์ฆ์ ๋ค๋ฅผ ์ ์๋ค.
# ์ค์ต
[์ธ์
1, 2 ๊ณตํต]
set tx_isolation = 'READ-UNCOMMITTEDโ
SET AUTOCOMMIT = FALSE
START TRNASACTION;
[์ธ์
1]
INSERT INTO EMP VALUES (4, โTestโ, โStudentโ);
[์ธ์
2]
MariaDB [mysql]> SELECT * FROM EMP WHERE ID = 4;
+----+------+---------+
| ID | NAME | JOB |
+----+------+---------+
| 4 | Test | Student |
+----+------+---------+
1 row in set (0.001 sec)
[์ธ์
1]
ROLLBACK;
[์ธ์
2]
MariaDB [mysql]> SELECT * FROM EMP WHERE ID = 4;
Empty set (0.000 sec)
- ์ด์ฒ๋ผ ์ธ์ 1 ํธ๋์ญ์ ์์ ์ฒ๋ฆฌํ ์์ ์ด ์๋ฃ๋์ง ์์์์๋ ๋ถ๊ตฌํ๊ณ (Commit) ์ธ์ 2 ํธ๋์ญ์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ์ ์๋ค.
- ์์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ์ธ์ 1 ํธ๋์ญ์ ์์ ์ฒ๋ฆฌํ ์์ ์ด ์ธ์ 2 ํธ๋์ญ์ ์์๋ ์กฐํ๊ฐ ๋๊ธฐ ๋๋ฌธ์ ์ธ์ 1์์ Rollback์ ํตํด ์ด์ ์ผ๋ก ๋๋ฆฌ๊ฒ ๋๋ฉด ์ธ์ 2๋ ์ด์ ์ ์กฐํํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ๋น์ฆ๋์ค ๋ก์ง์ ์ํํ๊ฒ ๋๋ค.
- ๋ฐ๋ผ์, ์์์ ์ธ๊ธํ๋ ๊ฒฉ๋ฆฌ์ฑ์ผ๋ก ๋ฐ์ํ๋ ๋ฌธ์ ์ค ํ๋์ธ โDirty Readโ ํ์์ด ๋ฐ์ํ๋ค.
(2-2) Read Committed - ์ปค๋ฐ๋ ๊ฒ์ ์ฝ์
ํธ๋์ญ์ ์ด ์ปค๋ฐ๋์ด ํ์ ๋ ๋ฐ์ดํฐ๋ง ๋ค๋ฅธ ํธ๋์ญ์ ์ด ์ฝ๋๋ก ํ์ฉํ๋ค.
- ์ฆ, ์ปค๋ฐ์ด ์๋ฃ๋ ๋ฐ์ดํฐ๋ง ์ฝ์ ์ ์๋ค๋ ๊ฒ์ด๋ค.
- ๋ฐ์ ๋ฌธ์ ์ : Non-Repeatable Read, Phantom Read
- ์ปค๋ฐ๋์ง ์์ ๋ฐ์ดํฐ์ ๋ํด์๋ ์ค์ DB ๋ฐ์ดํฐ๊ฐ ์๋ UNDO ๋ก๊ทธ์ ์๋ ์ด์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ฒ ๋๋ค.
- Uncommitted Read ์์ค์ ๋นํด ๋์ ์ฒ๋ฆฌ ์ฑ๋ฅ์ ๋จ์ด์ง๋ Dirty Read๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ ์๋ค.
- ํ์ง๋ง ์ฌ์ ํ Non-Repeatable Read์ Phantom Read์ ๋ํด์๋ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์๋ค.
- ์ฐธ๊ณ ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋ ์ธ ๋ ๋ด๋ถ์ ์ผ๋ก Lock์ด ์ฌ์ฉ๋๋ฉฐ DBMS ๋ง๋ค ์ฌ์ฉ๋๋ Lock ๋ฉ์ปค๋์ฆ์ ๋ค๋ฅผ ์ ์๋ค.
[์ฐธ๊ณ ] UNDO ๋ก๊ทธ
- Mysql, MariaDB์์ ์ฌ์ฉ๋๋ InnoDB ์คํ ๋ฆฌ์ง ์์ง์ ํธ๋์ญ์ ์ด Rollback ๋ ๊ฐ๋ฅ์ฑ์ ๋๋นํด ๋ณ๊ฒฝ๋๊ธฐ ์ ๋ ์ฝ๋๋ฅผ UNDO ๊ณต๊ฐ์ ๋ฐฑ์ ํด๋๊ณ ์ค์ ๋ ์ฝ๋ ๊ฐ์ ๋ณ๊ฒฝํ๋ค.
- ์ด๋ฌํ ๋ณ๊ฒฝ ๋ฐฉ์์ MVCC (Multi-Version Concurrency Control) ์ด๋ผ๊ณ ํ๋ค.
- ์ฆ, Read-UnCommitted๋ ๋ฐ์ดํฐ ํ์ผ์์ ๋ฐ์ดํฐ๋ฅผ ์ง์ ์ฝ์ด์ค๋ฉฐ Read-Committed๋ ๋ฐ์ดํฐ ํ์ผ์ด ์ปค๋ฐ๋์ง ์์ ๋ฐ์ดํฐ์ผ ๊ฒฝ์ฐ UNDO ๋ก๊ทธ์์ ์ต์ UNDO ๋ ์ฝ๋๋ฅผ ์ฝ์ด์ค๋ ๊ฒ์ด๋ค.
- ์ ๋ฆฌํ์๋ฉด UNDO ๋ก๊ทธ๋ โํธ๋์ญ์ ์ ๋กค๋ฐฑ ๋๋น์ฉโ, โํธ๋์ญ์ ์ ๊ฒฉ๋ฆฌ ์์ค์ ์ ์งํ๋ฉฐ ๋์ ๋์์ฑ ์ ๊ณตโ ์ฉ๋๋ก ์ฌ์ฉ๋๋ค.
# ์ค์ต
[์ธ์
1, 2 ๊ณตํต]
set tx_isolation = 'READ-COMMITTED';
SET AUTOCOMMIT = FALSE
START TRNASACTION;
[์ธ์
2]
MariaDB [mysql]> SELECT * FROM EMP;
+----+-------+---------+
| ID | NAME | JOB |
+----+-------+---------+
| 1 | userA | Student |
| 2 | userB | Student |
| 3 | userC | Student |
+----+-------+---------+
3 rows in set (0.000 sec)
[์ธ์
1]
UPDATE EMP SET NAME = โmodifiedโ WHERE ID = 3;
[์ธ์
2]
MariaDB [mysql]> SELECT * FROM EMP;
+----+-------+---------+
| ID | NAME | JOB |
+----+-------+---------+
| 1 | userA | Student |
| 2 | userB | Student |
| 3 | userC | Student |
+----+-------+---------+
3 rows in set (0.000 sec)
โ Dirty Read ํ์์ ๋ฐ์ํ์ง ์์์ ํ์ธํ ์ ์๋ค.
[์ธ์
1]
COMMIT;
[์ธ์
2]
MariaDB [mysql]> SELECT * FROM EMP;
+----+----------+---------+
| ID | NAME | JOB |
+----+----------+---------+
| 1 | userA | Student |
| 2 | userB | Student |
| 3 | modified | Student |
+----+----------+---------+
3 rows in set (0.000 sec)
- ์ด์ฒ๋ผ ์ธ์ 1 ํธ๋์ญ์ ์์ ๋ฐ์ดํฐ๊ฐ ์์ ๋์์ง๋ง Commit์ด ์๋๊ธฐ ๋๋ฌธ์ ์ธ์ 2 ํธ๋์ญ์ ์์๋ ์์ ๋ ๋ฐ์ดํฐ๋ก ์กฐํ๋์ง ์๋๋ค.
- ๋ฐ๋ผ์, Dirty Read ๋ฌธ์ ๋ ํด๊ฒฐ๋์์ง๋ง ์ธ์ 2 ํธ๋์ญ์ ์ EMP ํ ์ด๋ธ์ ID = 3๋ฒ์ธ ROW๋ฅผ ๋ ๋ฒ SELECT ํ๋๋ฐ ๋ ๋ฒ์งธ SELECT์ ํ๊ธฐ ์ ์ ์ธ์ 1 ํธ๋์ญ์ ์์ ํด๋น ROW๋ฅผ ์์ ํ๊ณ COMMIT ํ๊ธฐ ๋๋ฌธ์ ์ธ์ 2 ํธ๋์ญ์ ์์์ ์ฒซ ๋ฒ์งธ SELECT์ ๋ ๋ฒ์งธ SELECT์ ๊ฒฐ๊ณผ๊ฐ ๋ค๋ฅด๊ฒ ๋์ค๋ Non-Repeatable Read ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
- ๊ทธ ์ธ์๋ ์ธ์ 1 ํธ๋์ญ์ ์์ UPDATE๋ฌธ์ด ์๋ INSERT๋ฌธ์ ์ฌ์ฉํ์๋ค๋ฉด Phantom Read ํ์ ๋ํ ๋ฐ์ํ๊ฒ ๋๋ค.
(2-3) Repeatable Read โ ๋ฐ๋ณต์ ์ผ๋ก ์ฝ์
ํธ๋์ญ์ ๋ด์์ ์ญ์ , ๋ณ๊ฒฝ์ ๋ํด์๋ UNDO ๋ก๊ทธ์ ๋ฃ์ด๋๊ณ , ์์ ๋ฐ์ํ ํธ๋์ญ์ ์ ๋ํด์๋ ์ค์ ๋ฐ์ดํฐ๊ฐ ์๋ UNDO ๋ก๊ทธ์ ์๋ ๋ฐฑ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋๋ก ํ๋ค.
- ๋ฐ๋ผ์, ๊ฐ์ ๋ณ๊ฒฝ์ ๋ํด์ ์ผ์ ํ ๊ฐ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๊ธฐ ๋๋ฌธ์ ์ญ์ ์ ์์ ์ ๋ํด์ ํธ๋์ญ์ ๋ด์ ๋ถ์ผ์น๋ฅผ ๊ฐ์ ธ์ค๋ Non-Repeatable Read ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
- ์ฆ, ํธ๋์ญ์ ๋ด์์ ํ ๋ฒ ์กฐํํ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ณตํด์ ์กฐํํด๋ ๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์กฐํ๋๋ค๋ ๊ฒ์ด๋ค.
- ๋ฐ์ ๋ฌธ์ ์ : Phantom Read
- ์ฐธ๊ณ ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋ ์ธ ๋ ๋ด๋ถ์ ์ผ๋ก Lock์ด ์ฌ์ฉ๋๋ฉฐ DBMS ๋ง๋ค ์ฌ์ฉ๋๋ Lock ๋ฉ์ปค๋์ฆ์ ๋ค๋ฅผ ์ ์๋ค.
# ์ค์ต
[์ธ์
1, 2 ๊ณตํต]
set tx_isolation = 'REPEATABLE-READโ
SET AUTOCOMMIT = FALSE
START TRNASACTION;
[์ธ์
2]
MariaDB [mysql]> SELECT * FROM EMP;
+----+-------+---------+
| ID | NAME | JOB |
+----+-------+---------+
| 1 | userA | Student |
| 2 | userB | Student |
| 3 | userC | Student |
+----+-------+---------+
3 rows in set (0.000 sec)
[์ธ์
1]
UPDATE EMP SET NAME = โmodifiedโ WHERE ID = 3;
COMMIT;
[์ธ์
2]
MariaDB [mysql]> select * from emp;
+----+-------+---------+
| ID | NAME | JOB |
+----+-------+---------+
| 1 | userA | Student |
| 2 | userB | Student |
| 3 | userC | Student |
+----+-------+---------+
3 rows in set (0.000 sec)
[์ธ์
1]
INSERT INTO EMP VALUES (4, โTestโ, โStudentโ);
COMMIT;
[์ธ์
2]
MariaDB [mysql]> select * from emp;
+----+-------+---------+
| ID | NAME | JOB |
+----+-------+---------+
| 1 | userA | Student |
| 2 | userB | Student |
| 3 | userC | Student |
+----+-------+---------+
3 rows in set (0.000 sec)
[์ธ์
2]
COMMIT;
MariaDB [mysql]> select * from emp;
+----+----------+---------+
| ID | NAME | JOB |
+----+----------+---------+
| 1 | userA | Student |
| 2 | userB | Student |
| 3 | modified | Student |
| 4 | Test | Student |
+----+----------+---------+
4 rows in set (0.000 sec)
- ์ด์ฒ๋ผ ์ธ์ 1 ํธ๋์ญ์ ์์ ํน์ ROW์ ๋ฐ์ดํฐ๊ฐ ์์ (์ญ์ ) + Commit ๋์ด๋ ์ธ์ 2 ํธ๋์ญ์ ์์๋ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๊ธฐ ์ ์ ๋ฐ์ดํฐ๋ก ์กฐํ๊ฐ ๋๋ค.
- ์ฆ, ํธ๋์ญ์ ๋ด์์ ํ ๋ฒ ์กฐํํ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ณตํด์ ์กฐํํด๋ ๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์กฐํ๋๋ค๋ ๊ฒ์ด๋ค.
- ๋ฐ๋ผ์, โRead Committedโ ๊ฒฉ๋ฆฌ์ฑ ์์ค์์ ๋ฐ์ํ๋ Non-Repeatable Read ๋ฌธ์ ๋ ํด๊ฒฐ์ด ๋์๋ค.
- ์ด๋ ์ธ์ 1 ํธ๋์ญ์ ์์ ๋ฐ์ดํฐ๊ฐ ์์ /์ญ์ + Commit ๋๋๋ผ๋ ์ธ์ 2 ํธ๋์ญ์ ์์๋ ์ค์ ๋ฐ์ดํฐ๊ฐ ์๋ ์ธ์ 1 ํธ๋์ญ์ ์์ UNDO ๋ก๊ทธ์ ์ ์ฅํ ๋ฐฑ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ๋๋ฌธ์ด๋ค.
- ๋ค๋ง, ์ธ์ 1 ํธ๋์ญ์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐ(INSERT) ๋ฐ Commit ํ๊ฒ ๋๋ฉด ์ธ์ 2 ํธ๋์ญ์ ์์ Phantom Read ๋ฌธ์ ๊ฐ ๋ฐ์ํด์ผ ํ์ง๋ง InnoDB ์คํ ๋ฆฌ์ง ์์ง์ ๋ฅ์คํธ ํค ๋ฝ์ ์ด์ฉํ์ฌ Phantom Read ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ๋๋ฌธ์ Phantom Read ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
(2-4) Serializable Read - ์ง๋ ฌํ๊ฐ ๊ฐ๋ฅ (์ฌ๋ฌ ํธ๋์ญ์ ์ด ์ค์์ ๊ธฐ๋ค๋ฆฌ๋ฉฐ ํ๋์ฉ ์ฒ๋ฆฌ๋จ)
ํธ๋์ญ์ ๋ด์์ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฒ ์ด์ ์ํํ ๋, ์ฒซ ๋ฒ์งธ ์ฟผ๋ฆฌ์ ์๋ ๋ ์ฝ๋๊ฐ ์ฌ๋ผ์ง๊ฑฐ๋ ๊ฐ์ด ๋ฐ๋์ง ์์์ ๋ฌผ๋ก ์๋ก์ด ๋ ์ฝ๋๊ฐ ๋ํ๋์ง๋ ์๋๋ก ํ๋ค.
- ๊ฐ์ฅ ๋จ์ํ ๊ฒฉ๋ฆฌ ์์ค์ด๋ฉด์ ๊ฐ์ฅ ์๊ฒฉํ ๊ฒฉ๋ฆฌ ์์ค์ผ๋ก ๊ฒฉ๋ฆฌ์ฑ์ผ๋ก ์ธํด ๋ฐ์ํ ์ ์๋ 3๊ฐ์ง ๋ฌธ์ ๋ฅผ ๋ชจ๋ ์ปค๋ฒ ๊ฐ๋ฅํ์ง๋ง ๋ค๋ฅธ ํธ๋์ญ์ ๊ฒฉ๋ฆฌ์ฑ ์์ค๋ณด๋ค ๋์ ์ฒ๋ฆฌ ์ฑ๋ฅ์ ํ์ ํ ๋จ์ด์ง๋ค.
- ํ ํธ๋์ญ์ ์์ ์ฝ๊ณ ์ฐ๋ ๋ ์ฝ๋๋ฅผ ๋ค๋ฅธ ํธ๋์ญ์ ์์๋ ๊ฒฉ๋ฆฌ์ฑ ์ ์ ๊ทธ๋๋ก ์ ๋ ์ ๊ทผํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ ํธ๋์ญ์ ์ด ์ค์์ ํ๋์ฉ ์ฒ๋ฆฌ๋๋ค.
- ๋ค๋ง ์ผ๋ฐ์ ์ธ DBMS์์๋ Serializable Read ์์ค์์๋ Phantom Read ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์ง๋ง InnoDB ์คํ ๋ฆฌ์ง ์์ง์ ์ฌ์ฉํ๋ DBMS์์๋ Repeatable Read ๊ฒฉ๋ฆฌ ์์ค์์๋ Phantom Read๊ฐ ๋ฐ์ํ์ง ์๊ธฐ ๋๋ฌธ์ ๊ตณ์ด Serializable Read ๊ฒฉ๋ฆฌ ์์ค์ ์ฌ์ฉํ ํ์์ฑ์ ์๋ค.
- ์ฐธ๊ณ ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋ ์ธ ๋ ๋ด๋ถ์ ์ผ๋ก Lock์ด ์ฌ์ฉ๋๋ฉฐ DBMS ๋ง๋ค ์ฌ์ฉ๋๋ Lock ๋ฉ์ปค๋์ฆ์ ๋ค๋ฅผ ์ ์๋ค.
# ์ค์ต
[์ธ์
1, 2 ๊ณตํต]
set tx_isolation = 'SERIALIZABLEโ;
SET AUTOCOMMIT = FALSE
START TRNASACTION;
[์ธ์
2]
MariaDB [mysql]> select * from emp;
+----+-------+---------+
| ID | NAME | JOB |
+----+-------+---------+
| 1 | userA | Student |
| 2 | userB | Student |
| 3 | userC | Student |
+----+-------+---------+
3 rows in set (0.000 sec)
[์ธ์
1]
INSERT INTO EMP VALUES (4, โTestโ, โStudentโ);
โ ์ธ์
2 ํธ๋์ญ์
์์ ํด๋น ํ
์ด๋ธ์ Lock์ ๊ฑธ์ด๋์๊ธฐ์ ํด๋น INSERT๋ฌธ์ ์คํ๋์ง ์๊ณ ๋๊ธฐ ์ํ๋ก ๋น ์ง๊ฒ ๋๋ค.
UPDATE EMP SET NAME = โmodifiedโ WHERE ID = 3;
โ UPDATE๋ฌธ ๋ํ ๋ง์ฐฌ๊ฐ์ง๋ก ํด๋น ํ
์ด๋ธ์ Lock์ด ๊ฑธ๋ ค์์ด ํด๋น UPDATE๋ฌธ์ ์คํ๋์ง ์๊ณ ๋๊ธฐ ์ํ๋ก ๋น ์ง๊ฒ ๋๋ค.
[์ ๋ฆฌ]

- ์ฌ์ฉํ๋ DBMS์์ ์ด๋ค ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค์ ์ ๊ณตํ๊ณ , ๊ฐ ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค์์ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ๋ฅผ ์ธ์งํ๋ ๊ฒ์ ๋งค์ฐ ์ค์ํ๋ค!
- ์์ ๊ทธ๋ฆผ์์ Repeatable Read ๊ฒฉ๋ฆฌ ์์ค์ InnoDB ์์ง์ ์ฌ์ฉํ ๊ฒฝ์ฐ, Phantom Read ๋ฌธ์ ๋ ๋ฐ์ํ์ง ์๋๋ค.
[์ฐธ๊ณ ] ํธ๋์ญ์ ๊ฒฉ๋ฆฌ์ฑ ์์ค๊ณผ DB Lock์ ์๊ด๊ด๊ณ
- ํธ๋์ญ์ ๊ฒฉ๋ฆฌ์ฑ ์์ค๊ณผ DB Lock์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํธ๋์ญ์ ๊ด๋ฆฌ์์ ์ค์ํ ๊ฐ๋ ์ผ๋ก, ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ๊ณผ ๋์์ฑ์ ์กฐ์ ํ๋ ๋ฐ์ ์ฌ์ฉ๋์ด์ง๋ค.
- ๊ฒฉ๋ฆฌ์ฑ ์์ค๊ณผ DB Lock์ ๋น์ทํ ๊ฐ๋ ์ฒ๋ผ ๋ณด์ผ ์ ์์ง๋ง ์๋ก ๋ค๋ฅธ ๊ฐ๋ ์ด๊ณ ์๋์ ๊ฐ์ ์ฐจ์ด์ ์ด ์๋ค.
โ ๊ฐ๋
์ ์ฐจ์ด
ํธ๋์ญ์
๊ฒฉ๋ฆฌ์ฑ ์์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฌ๋ฌ ํธ๋์ญ์
๋ค์ด ๋์์ ์คํ๋ ๋, ์๋ก์๊ฒ ์ด๋ป๊ฒ ์ํฅ์ ๋ฏธ์น๋ ์ง๋ฅผ ๊ฒฐ์ ํ๋ ์ค์ ์ผ๋ก ๊ฒฉ๋ฆฌ์ฑ ์์ค์ ํธ๋์ญ์
๋ค ๊ฐ์ ๋์ ์ ๊ทผ๊ณผ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๋๋ฐ ์ฌ์ฉ๋๋ค.
DB Lock์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฌ๋ฌ ํธ๋์ญ์ ๋ค์ด ๋์์ ๋ฐ์ดํฐ์ ์ ๊ทผํ ๋, ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ๋ฉ์ปค๋์ฆ์ผ๋ก Lock์ ํธ๋์ญ์ ๋ค์ด ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋ ์ฐ๋ ๋์ ๋ค๋ฅธ ํธ๋์ญ์ ๋ค์ด ํด๋น ๋ฐ์ดํฐ์ ๋ํ ์ ๊ทผ์ ์ ํํจ์ผ๋ก์จ ๋์์ฑ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๋ค.
โก ์ ์ฉ ๋ฒ์
ํธ๋์ญ์
๊ฒฉ๋ฆฌ์ฑ ์์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ฒด์ ์ ์ฉ๋๋ ์ค์ ์ด๋ฉฐ, ๊ฐ ํธ๋์ญ์
์ ์ด ๊ฒฉ๋ฆฌ์ฑ ์์ค์ ๋ฐ๋ผ ๋์ํ๋ค.
๊ฒฉ๋ฆฌ์ฑ ์์ค์ ํธ๋์ญ์ ์ ์์ ์์ ์ ์ค์ ๋๋ฉฐ, ํด๋น ํธ๋์ญ์ ์ ์ํ ๋์ค์ ๋ณ๊ฒฝ๋์ง ์๋๋ค.
DB Lock์ ๊ฐ๋ณ ๋ฐ์ดํฐ๋ ๋ฐ์ดํฐ ๋ธ๋ก์ ์ ์ฉ๋๋ Lock ๋ฉ์ปค๋์ฆ์ผ๋ก ํน์ ํธ๋์ญ์ ์ด ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋ ์ฐ๊ธฐ ์ํด ํด๋น ๋ฐ์ดํฐ์ ๋ํ Lock์ ํ๋ํ๊ณ ์์ ์ด ์๋ฃ๋ ํ์ Lock์ ํด์ ํ๋ค.
โข ์๋๊ด๋ฆฌ vs ์๋๊ด๋ฆฌ
ํธ๋์ญ์
๊ฒฉ๋ฆฌ์ฑ ์์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ
์ด ์๋์ผ๋ก ๊ด๋ฆฌํ๋ ์ค์ ์ด๋ฉฐ ๊ฐ๋ฐ์๊ฐ ์ง์ ๋ฝ์ ์ค์ ํ๊ฑฐ๋ ํด์ ํ ํ์๊ฐ ์๋ค.
DB ๋ฝ์ ๊ฐ๋ฐ์๊ฐ ํน์ ๋ฐ์ดํฐ์ ๋ํด Lock์ ์๋์ผ๋ก ์ค์ ํ๊ณ ํด์ ํด์ผ ํ๋ค.
โฃ ๋์์ฑ๊ณผ ์ผ๊ด์ฑ ๋ณด์ฅ
ํธ๋์ญ์
๊ฒฉ๋ฆฌ์ฑ ์์ค์ ํธ๋์ญ์
๋ค ๊ฐ์ ๋์ ์ ๊ทผ๊ณผ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๋๋ฐ ์ฌ์ฉ๋๋ฉฐ, ๊ฒฉ๋ฆฌ์ฑ ์์ค์ ๋์ผ์๋ก ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ๋ณด์ฅ๋์ง๋ง ๋์์ฑ์ ๊ฐ์ํ ์ ์๋ค.
DB Lock์ ๋์์ฑ์ ๊ด๋ฆฌํ์ฌ ์ฌ๋ฌ ํธ๋์ญ์ ์ด ๋ฐ์ดํฐ๋ฅผ ๋์์ ์ ๊ทผํ๋ ๊ฒ์ ์ ์ดํจ์ผ๋ก์จ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๋ค.
โ ์์ฝํ์๋ฉด ํธ๋์ญ์ ๊ฒฉ๋ฆฌ์ฑ ์์ค๊ณผ DB ๋ฝ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋์์ฑ๊ณผ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ๊ด๋ฆฌํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๊ฐ๋ ์ด๋ค!
โ ํธ๋์ญ์ ๊ฒฉ๋ฆฌ์ฑ ์์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ฒด์ ์ ์ฉ๋๋ ์ค์ ์ผ๋ก, ๊ฒฉ๋ฆฌ์ฑ ๋ ๋ฒจ์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋์ ์ ๊ทผ์ ์กฐ์ ํ๊ธฐ ์ํด DB Lock์ ์ค์ ํ๊ณ ํด์ ํ๋ค.
โ DB Lock์ ์ค์ ๊ณผ ํด์ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ ๋ด๋ถ์์ ์๋์ผ๋ก ์ฒ๋ฆฌํ๋ฉฐ ๊ฐ๊ฐ์ ๊ฒฉ๋ฆฌ์ฑ ๋ ๋ฒจ์ ๋ฐ๋ผ ์ฌ์ฉ๋๋ DB Lock ๋ฉ์ปค๋์ฆ์ DBMS๋ง๋ค ๋ค๋ฅผ ์ ์๋ค.
โ ์ฆ, ๊ฒฉ๋ฆฌ์ฑ ๋ ๋ฒจ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฌ์ฉ๋๋ DB Lock์ ์ข ๋ฅ์ ๋์ ๋ฐฉ์์ ๊ฒฐ์ ํ๋ฉฐ ๊ฐ ๊ฒฉ๋ฆฌ์ฑ ๋ ๋ฒจ์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ฝ๊ธฐ์ ์ฐ๊ธฐ์ ์ด๋ค DB Lock์ ์ฌ์ฉํ ์ง ์๋์ผ๋ก ์ค์ ํ๊ณ ๊ฒฉ๋ฆฌ์ฑ ๋ ๋ฒจ์ด ๋์์๋ก ๋ ๊ฐ๋ ฅํ DB Lock์ด ์ฌ์ฉ๋๋ฉฐ ๋์ ์ ๊ทผ์ด ์ ํ๋๊ณ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ด ๋ณด์ฅ๋์ด์ง๋ค.
โ ๋ฐ๋ผ์, ์ ์ ํ ๊ฒฉ๋ฆฌ์ฑ ๋ ๋ฒจ์ ์ค์ ํจ์ผ๋ก์จ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ ์ด ์์์ DB Lock์ ๊ด๋ฆฌํ๊ฒ ๋๋ฏ๋ก ๊ฐ๋ฐ์๋ ๊ฒฉ๋ฆฌ์ฑ ๋ ๋ฒจ๋ง ์ ์ ํ ์ ํํ์ฌ ํธ๋์ญ์ ์ ๋์์ฑ๊ณผ ์ผ๊ด์ฑ์ ์กฐ์ ํ๋ฉฐ Lock ๊ด๋ฆฌ์ ์ ๊ฒฝ์ฐ์ง ์๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์กฐ์์ ์ง์คํ ์ ์๋ค.
โ ๋ค๋ง, ๋งํ๋ค์ํผ ๊ฒฉ๋ฆฌ์ฑ ์์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ฒด์ ์ ์ฉ๋๋ ์ค์ ์ด๋ฏ๋ก ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ์ํด ๋์ ๊ฒฉ๋ฆฌ์ฑ ์์ค์ ์ฌ์ฉํ๊ฒ ๋๋ฉด ๋์์ฑ์ด ๊ฐ์ํ ์ ์์ผ๋ฏ๋ก ์ฑ๋ฅ์ ๊ฐ์ํ์ฌ ์ ์ ํ ๊ฒฉ๋ฆฌ์ฑ ๋ ๋ฒจ์ ์ ํํ๊ณ ํ์์ ์ผ๋ก ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ด ๋ณด์ฅ๋์ด์ผ ํ๋ ํ ์ด๋ธ[๋ฐ์ดํฐ]์ ํํด ๊ฐ๋ฐ์๊ฐ ์๋์ผ๋ก DB ๋ฝ์ ์ค์ ํ๋ค.
[Reference]
https://armful-log.tistory.com/57
[DB] ํธ๋์ญ์ ํน์ง, ๊ฒฉ๋ฆฌ ์์ค, ๊ด๋ จ ๋ฌธ์ ์
_ํธ๋์ญ์ ์ด ๋ณด์ฅํด์ผ ํ๋ ACID Atomicity(์์์ฑ) : ํ ํธ๋์ญ์ ๋ด์์ ์คํํ ์์ ๋ค์ ํ๋์ ์์ ์ผ๋ก ๊ฐ์ฃผ. ๋ชจ๋ ์ฑ๊ณต ๋๋ ์คํจ๋์ด์ผ ํ๋ค. Consistency(์ผ๊ด์ฑ) : ๋ชจ๋ ํธ๋์ญ์ ์ ์ผ๊ด์ฑ ์๋
armful-log.tistory.com
DB ํธ๋์ญ์ - ๊ฒฉ๋ฆฌ์์ค(Transaction Isolation Level)
ํธ๋์ญ์ DB์์์ ํธ๋์ญ์ ์ด๋, ๋ณดํต ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ด๋ค ๋ณ๊ฒฝ์ ์ ๋ฐํ๋ ์์ ๋จ์๋ฅผ ์๋ฏธํ๋ค. ๋ ผ๋ฆฌ์ ์ผ๋ก ํ ๊ฐ์ ์คํ ๋จ์๋ฅผ ๋ปํ๋ฉฐ, ๋ฌผ๋ฆฌ์ ์ผ๋ก๋ ํ ๊ฐ ํน์ ์ฌ๋ฌ ๊ฐ์ ์คํ๋จ์๊ฐ
luran.me
https://sabarada.tistory.com/117
[๋ฐ์ดํฐ๋ฒ ์ด์ค] ํธ๋์ญ์ ๊ณผ ๊ฒฉ๋ฆฌ์ฑ
์๋ ํ์ธ์. ํ์์ ํฌ์คํ ํ๋ ๋ด์ฉ๊ณผ๋ ์กฐ๊ธ ๋จ์ด์ง ์ด๋ก ์ ์ธ ๋ด์ฉ์ ํฌ์คํ ํ๊ณ ์ ํฉ๋๋ค. DB๋ ํธ๋์ญ์ ๋จ์๋ก ์ฒ๋ฆฌ๋๋ค๊ณ ํฉ๋๋ค. ์ ๋ช ํ All Or Nothing์ด DB์ ํธ๋์ญ์ ์์ ๋์จ ์ด์ผ๊ธฐ์
sabarada.tistory.com
https://incheol-jung.gitbook.io/docs/q-and-a/db/isolation-level
Isolation level - Incheol's TECH BLOG
ํธ๋์ญ์ (Transaction A) ์ค์ ํน์ ์กฐ๊ฑด์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ์ป์๋ค. ์ด๋ ๋ค๋ฅธ ํธ๋์ญ์ (Transaction B)๊ฐ ์ ๊ทผํด ํด๋น ์กฐ๊ฑด์ ๋ฐ์ดํฐ ์ผ๋ถ๋ฅผ ์ญ์ ๋๋ ์ถ๊ฐํ์๋, ์์ง ๋๋์ง ์์ Transac
incheol-jung.gitbook.io
ํธ๋์ญ์ ๊ณผ ๊ฒฉ๋ฆฌ ๋ ๋ฒจ ๊ทธ๋ฆฌ๊ณ Lock์ ๋ํ์ฌ
* ํ์ต์ ๋์์ ์ฃผ์ ์คํฐ๋์ ์ค๊ธธํ๋๊ป ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ํธ๋์ญ์ (Transaction) ์ํคํผ๋์์ ์ค๋ช ํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํธ๋์ญ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ ์์คํ ๋๋ ์ ์ฌํ ์์คํ ์์ ์ํธ์์ฉ์ ๋จ
jordy-torvalds.tistory.com
https://zzang9ha.tistory.com/381
[MySQL] - ํธ๋์ญ์ ์ ๊ฒฉ๋ฆฌ ์์ค(Isolation level)
๐ ๊ธ๋ 6๊ธฐ ํฌ์คํ 1. ๋ฏธ์น๋๋ก ๋์ ๋ 7์์ ํ๊ณ 2. ์ฌ์ฉ์๊ฐ ๊ฒ์๋ฌผ์ ์์ฑํ ๋์ ํธ๋์ญ์ ์ฒ๋ฆฌ 3. Spring AOP - (1) ํ๋ก์ ํจํด, ๋ฐ์ฝ๋ ์ดํฐ ํจํด 4. [MySQL] - ํธ๋์ญ์ ์ ๊ฒฉ๋ฆฌ ์์ค(Isolation level) 5
zzang9ha.tistory.com
https://overcome-the-limits.tistory.com/528
[๋ฐ์ดํฐ๋ฒ ์ด์ค] ํธ๋์ญ์
๋ค์ด๊ฐ๋ฉฐ SOPT์์ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์, Sequelize ORM์ ํ์ฉํด์ ํ๋ก์ ํธ๋ฅผ ๊ด๋ฆฌํ์ต๋๋ค. ํ์ง๋ง Sequelize๋ฅผ ํ์ฉํ๋ค ๋ณด๋, SQL์ ์๋ฆฌ์ ๋ํด์ ์ ๋๋ก ์ ์ ์์์ต๋๋ค. Sequelize์ ๋ฌธ์ ๊ฐ ์
overcome-the-limits.tistory.com
- ChatGPT ํฌํจ
'๐จโ๐ป Back End > MySQL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
DB Lock ์ฌํ (์ด๋ ค์ด ๋ถ๋ถ์ด ๋๋ฌด ๋ง์....์์ฑ์ค....) (0) | 2023.07.30 |
---|---|
DB Lock ๊ธฐ์ด (0) | 2023.07.30 |
ํธ๋์ญ์ (Transaction) (0) | 2023.07.22 |
๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ ์ ์ฝ ์กฐ๊ฑด (0) | 2023.07.22 |
Join (์กฐ์ธ) - ๋ด๋ถ ์กฐ์ธ (Inner Join) & ์ธ๋ถ ์กฐ์ธ (Outer Join) (0) | 2023.07.22 |
1) ํธ๋์ญ์
(1) ํธ๋์ญ์ ์ด๋
- DB ์์์ ํธ๋์ญ์ ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ํํ๋ ์์ ์ ๋ ผ๋ฆฌ์ ์ธ ๋จ์๋ฅผ ๋งํ๋ฉฐ, ํ๋์ ํธ๋์ญ์ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ผ๋ จ์ ์์ ๋ค์ ํฌํจํ๋ฉฐ ์ด๋ฌํ ์์ ๋ค์ ๋ชจ๋ ์ฑ๊ณต์ ์ผ๋ก ์ํ๋๊ฑฐ๋ ์คํจํด์ผ ํ๋ค. โ All or Nothing ์ ๋ต
(2) ํธ๋์ญ์ ์ 4๊ฐ์ง ํน์ฑ (ACID)
- DB์์์ ํธ๋์ญ์ ์ ์๋์ 4๊ฐ์ง ํน์ฑ์ ์ง๋๋ค.
(2-1) Atomicity (์์์ฑ)

- ํธ๋์ญ์ ์ ๋ ผ๋ฆฌ์ ์ผ๋ก ํ๋์ ์คํ ๋จ์์ฌ์ผ ํ๊ณ ๋ฌผ๋ฆฌ์ ์ผ๋ก ์ฌ๋ฌ ๊ฐ์ Statement๋ก ๊ตฌ์ฑ๋์ด ์๋ค ํ๋๋ผ๋ ๋ ผ๋ฆฌ์ ์ธ ๋จ์๋ก ๋ฌถ์ผ ์ ์์ด์ผ ํ๋ค.
- ํ๋์ ์คํ ๋จ์๋ผ๋ฉด ๋ ๊ฐ์ ์ํ๋ก ๊ท๊ฒฐ๋๋๋ฐ, ์ฑ๊ณตํ๊ฑฐ๋ ๋๋ ์คํจํ๊ฑฐ๋์ด๋ค. (All or Nothing)
- ์ฆ, ์ฌ๋ฌ ๊ฐ์ Statement๋ก ์์ฑ๋์๋ค ํ๋๋ผ๋ ํ๋์ ํธ๋์ญ์ ์ผ๋ก ๋ฌถ์ธ๋ค๋ฉด ํ ํธ๋์ญ์ ๋ด์์ ์คํํ ์์ ๋ค์ ํ๋์ ์์ ์ผ๋ก ๊ฐ์ฃผํ๊ณ ๋ชจ๋ ์ฑ๊ณต ๋๋ ์คํจ๋์ด์ผ ํ๋ค๋ ๊ฒ์ด๋ค. (๋ถ๋ถ ์ฑ๊ณต / ๋ถ๋ถ ์คํจ ์์)
(2-2) Consistency (์ผ๊ด์ฑ)

- ํธ๋์ญ์ ์ ์์ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ ํญ์ ์ผ๊ด์ฑ์ด ์์ด์ผ ํ๋ฉฐ, ํธ๋์ญ์ ์ด ์งํ๋๋ ๋์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๋ณ๊ฒฝ๋๋๋ผ๋ ์ ๋ฐ์ดํธ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ํธ๋์ญ์ ์ด ์งํ๋๋ ๊ฒ์ด ์๋๋ผ, ์ฒ์์ ํธ๋์ญ์ ์ ์งํํ๊ธฐ ์ํด ์ฐธ์กฐํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ์งํ๋๋ค.
(2-3) Isolation (๊ฒฉ๋ฆฌ์ฑ)

- ๋ ์ด์์ ํธ๋์ญ์ ์ด ๋์์ ์คํ๋๊ณ ์์ ๊ฒฝ์ฐ, ์ด๋ค ํ๋์ ํธ๋์ญ์ ์ด๋ผ๋ ๋ค๋ฅธ ํธ๋์ญ์ ์ ์ฐ์ฐ์ ๋ผ์ด๋ค ์ ์๋ค.
- ์ํ ์ค์ธ ํธ๋์ญ์ ์ ์์ ํ ์๋ฃ๋ ๋๊น์ง ๋ค๋ฅธ ํธ๋์ญ์ ์์ ์ํ ๊ฒฐ๊ณผ๋ฅผ ์ฐธ์กฐํ ์ ์๋ค.
โ ์ฆ, ๋์์ ์คํ๋๋ ํธ๋์ญ์ ๋ค์ด ์๋ก ์ํฅ์ ๋ฏธ์น์ง ์๋๋ก ๊ฒฉ๋ฆฌํ๋ค๋ ๊ฒ์ด๋ค.
(2-4) Durability (์ง์์ฑ)
- ํธ๋์ญ์ ์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋์์ ๊ฒฝ์ฐ, ๊ทธ ๊ฒฐ๊ณผ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์์ ์ผ๋ก ์ ์ฅ, ๋ฐ์๋์ด์ผ ํ๋ค. (COMMIT)
- ๋น๋ก ํธ๋์ญ์ ์ด ์คํจ๋๋๋ผ๋ ๊ทธ ์ํ๊ฐ ์ผ๊ด๋๊ฒ ์ ์ง๋์ด์ผ ํ๋ค. (ROLLBACK)
2) ํธ๋์ญ์ ๊ฒฉ๋ฆฌ์ฑ (Transaction Isolation)
- ํธ๋์ญ์ ์ ํน์ฑ ์ค ๊ฒฉ๋ฆฌ์ฑ์ ๋ํด ์์ธํ๊ฒ ์์๋ณด์!
- ์์์ ์ดํด๋ณด์๋ฏ์ด, ๊ฒฉ๋ฆฌ์ฑ์ โ์คํ ์ค์ธ ํธ๋์ญ์ ์ ์ค๊ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ค๋ฅธ ํธ๋์ญ์ ์ด ์ ๊ทผํ ์ ์๋ค.โ๋ผ๊ณ ํ์์ผ๋ ๋ง์ฐํ๊ฒ ์ ๊ทผํ ์ ์๋ค๋ผ๊ธฐ ๋ณด๋ค๋ ์ผ๋ฐ์ ์ผ๋ก ์ ๊ทผ ๋ ๋ฒจ์ด ์กด์ฌํ๊ณ DB์ ๋ฐ๋ผ ์ค์ ์ด ๊ฐ๋ฅํ๋ค.
- ์ด๋ฌํ ๊ฒฉ๋ฆฌ์ฑ ์ ๊ทผ ๋ ๋ฒจ์ ๊ฐํ๊ฒ ์ฒ๋ฆฌํ ์๋ ์๊ณ ๋ฐ๋๋ก ์ฝํ๊ฒ ์ฒ๋ฆฌํ ์๋ ์๋ค.
- ์ผ๋จ ๊ฒฉ๋ฆฌ์ฑ์ผ๋ก ์ธํด ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ์ ์ ๋จผ์ ์ดํด๋ณธ ๋ค์ ๊ฒฉ๋ฆฌ์ฑ ์ ๊ทผ ๋ ๋ฒจ์ ์์๋ณผ ์์ ์ด๋ค.
(1) ๊ฒฉ๋ฆฌ์ฑ์ผ๋ก ์ธํด ๋ฐ์ํ ์ ์๋ ๋ฌธ์
- ๊ฒฉ๋ฆฌ์ฑ์ผ๋ก ์ธํด ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ๋ ์ผ๋ฐ์ ์ผ๋ก Dirty Read, Non-Repeatable Read, Phantom Read 3๊ฐ์ง์ด๋ค.
(1-1) Dirty Read

Dirty Read๋ ๋ค๋ฅธ ํธ๋์ญ์ ์ ์ํด ์์ ๋์ง๋ง ์์ง ์ปค๋ฐ๋์ง ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋ ๊ฒ์ ๋งํ๋ค.
- ๋ง์ฝ, Transaction_1์ด ์ ์์ฒ๋ฆฌ๋์ง ์๊ณ Rollback ๋ ์๋ ์๋๋ฐ ์ด๋ฐ ๊ฒฝ์ฐ, ๊ทธ ๊ฐ์ ์ด๋ฏธ ์ฝ์ Transaction_2๋ ์๋ชป๋ ๊ฐ์ ๊ฐ์ง๊ณ ๋ณธ์ธ์ ๋ก์ง์ ์ฒ๋ฆฌํ๋ ์ํ์ ๋์ด๊ฒ ๋๋ค.
- ์ฆ, Transaction_2๋ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ด ๊นจ์ง ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค๋ ๊ฒ์ด๋ค.
(1-2) Non-Repeatable Read

Non-Repeatable Read๋ ํ ํธ๋์ญ์ ๋ด์์ ๊ฐ์ Key๋ฅผ ๊ฐ์ง Row๋ฅผ ๋ ๋ฒ Read ํ์๋๋ฐ ๊ทธ ์ฌ์ด์ ๊ฐ์ด ๋ณ๊ฒฝ๋๊ฑฐ๋ ์ญ์ ๋์ด ๊ฒฐ๊ณผ๊ฐ ๋ค๋ฅด๊ฒ ๋ํ๋๋ ํ์์ ๋งํ๋ค.
- ์ฆ, Transaction_2์์ ํน์ Row๋ฅผ 2๋ฒ Read ํ๋๋ฐ ๊ทธ ์ฌ์ด์ Transaction_1์ด ํด๋น Row๋ฅผ Updateํ๊ฑฐ๋ Delete ํ์ Commit ํ๊ฒ ๋์ด Transaction_2์์ ๋ค์ Read ํ์์ ๋, ๊ฐ์ด ๋ค๋ฅด๊ฒ ๋์ค๋ ๊ฒ์ด๋ค.
(1-3) Phantom Read

ํ ํธ๋์ญ์ ๋ด์์ ๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฒ ์ํํ์๋๋ฐ, ์ฒซ ๋ฒ์งธ ์ฟผ๋ฆฌ์์ ์๋ ์ ๋ น ๋ ์ฝ๋ (Phantom Record)๊ฐ ๋ ๋ฒ์งธ ์ฟผ๋ฆฌ์์ ๋ํ๋๋ ํ์์ ๋งํ๋ค.
- ์ฆ, Transaction_2๊ฐ ํน์ ์กฐ๊ฑด์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ์ป์์ผ๋ ์ด ๋, ๋ค๋ฅธ Transaction_1์ด ํด๋น ์กฐ๊ฑด์ ๋ฐ์ดํฐ ์ผ๋ถ๋ฅผ ์ถ๊ฐ/์ญ์ ํ๊ณ Commit ํ๊ฒ ๋์ด ์์ง ๋๋์ง ์์ Transaction_2๊ฐ ํด๋น ์กฐ๊ฑด์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ฉด Transaction_1์์ ์ถ๊ฐ/์ญ์ ํ ๋ฐ์ดํฐ๊ฐ ํจ๊ป ์กฐํ/๋๋ฝ ๋๋ค๋ ๊ฒ์ด๋ค.
- Phantom Read์ Non-Repeatable Read๋ฅผ ํท๊ฐ๋ฆด ์ ์๋๋ฐ Non-Repeatable Read๋ 1๊ฐ์ Row์ ๋ฐ์ดํฐ์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ ๊ฒ์ด๋ฉฐ (Update ๋๋ Delete), Phantom Read๋ ๋ค์์ ๊ฑด์ ์์ฒญํ๋ ๊ฒ์ ๋ํด์ ๋ฐ์ดํฐ์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ ๊ฒ์ด๋ค.
(2) DB์์ ์ง์ ํ ์ ์๋ ๊ฒฉ๋ฆฌ์ฑ ์์ค [๊ฒฉ๋ฆฌ์ฑ ์ ๊ทผ ๋ ๋ฒจ]
- ๊ทธ๋ ๋ค๋ฉด ์ด์ DataBase์์ ์ ๊ณตํ๋ ๊ฒฉ๋ฆฌ์ฑ ์์ค (Transaction Isolation Level)์ ๋ํด์ ์์๋ณด์.
- ANSI/ISO SQL ํ์ค(SQL92)์์๋ ํธ๋์ญ์ ์ ๊ฒฉ๋ฆฌ์ฑ๊ณผ ๋์ ์ฒ๋ฆฌ ์ฑ๋ฅ ์ฌ์ด์ Trade-Off๋ฅผ ๋๊ณ ๊ฒฉ๋ฆฌ์ฑ ์ ๊ทผ ๋ ๋ฒจ์ 4๋จ๊ณ๋ก ๋๋์๋ค.
- ๊ฒฉ๋ฆฌ ์์ค์ด ๋์์ง ์๋ก ์์์ ์ธ๊ธํ๋ ๊ฒฉ๋ฆฌ์ฑ์ผ๋ก ์ธํ ์ด์๋ ์ ๊ฒ ๋ฐ์ํ์ง๋ง ๋์ ์ฒ๋ฆฌ ์ฑ๋ฅ์ ๋จ์ด์ง๊ฒ ๋๋ค. (Trade-Off ๊ด๊ณ)
- ๋ํ, ํธ๋์ญ์ ์ด ๋ฐ์ํ๊ฒ ๋๋ฉด DB ๋ด๋ถ์ ์ผ๋ก DB ๋ฝ(DB Lock)์ด ๊ฑธ๋ฆฌ๊ฒ ๋๋๋ฐ ๋ฝ์ ๋ํด์๋ ๋ท ๋ถ๋ถ์์ ๋ค๋ฃฐ ์์ ์ด๋ค.
- ์ฐธ๊ณ ๋ก DBMS ์ ํ๋ง๋ค ๋ด๋ถ์ ์ผ๋ก ๊ฒฉ๋ฆฌ์ฑ ์ ๊ทผ ์์ค or Lock ๋ฉ์ปค๋์ฆ์ ๋ค๋ฅผ ์ ์์ผ๋ฏ๋ก ํ์ํ ์, ํด๋น DB์ Document ๋ฌธ์๋ฅผ ์ฝ์ด๋ณด์
- ํด๋น ๋ด์ฉ์ MySQL์ ํตํด ์ค์ตํ ๊ฒ์ด๋ฏ๋ก ์๋์ SQL์ ํตํด ์ค์ต์ฉ ํ ์ด๋ธ์ ์์ฑํ๊ณ , ์ฉ์ดํ ์ค์ต์ ์ํด ๋ณ๋์ ์ ์ฝ ์กฐ๊ฑด์ ์ค์ ํ์ง ์๋๋ค.
// ํ
์ด๋ธ ์์ฑ
CREATE TABLE EMP (
ID INT not null auto_increment,
NAME VARCHAR(100) not null,
JOB VARCHAR(30) not null,
primary key (ID));
// ์ด๊ธฐ ๋ฐ์ดํฐ ์์ฑ
insert into EMP values (1, "userA", 'Student');
insert into EMP values (2, "userB", 'Student');
insert into EMP values (3, "userC", 'Student');
[์ฐธ๊ณ ] ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค ์กฐํ ๋ฐ ์์ (MariaDB)

// ํธ๋์ญ์
๊ฒฉ๋ฆฌ ์์ค ์กฐํ
show variables like 'tx_isolation';
// ํธ๋์ญ์
๊ฒฉ๋ฆฌ ์์ค ์์
set tx_isolation = 'READ-UNCOMMITTEDโ
// Autocommit ์ค์ ๊ฐ ํ์ธ
show variables like 'autocommit%';
// Autocommit ๋๊ธฐ
SET AUTOCOMMIT = FALSE
- ์ถ๊ฐ์ ์ผ๋ก ๊ฒฉ๋ฆฌ์ฑ ์์ค ์ค์ต์ ์ํด ๋ฏธ๋ฆฌ DB ์ธ์ ์ 2๊ฐ ์ฐ๊ฒฐํด๋๋๋ก ํ๊ณ Autocommit ๊ธฐ๋ฅ์ ๋๋๋ก ํ๋ค.
(2-1) Read Uncommitted - ์ปค๋ฐ๋์ง ์๋ ๊ฒ์ ์ฝ์
ํธ๋์ญ์ ์์ ์ฒ๋ฆฌ ์ค์ธ, ์์ง ์ปค๋ฐ๋์ง ์์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฅธ ํธ๋์ญ์ ์ด ์ฝ๋ ๊ฒ์ ํ์ฉํ๋ค.
- ์ฆ, ์ปค๋ฐํ์ง ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ์ ์๋ค๋ ๊ฒ์ด๋ค.
- ๋ฐ์ ๋ฌธ์ ์ : Dirty Read, Non-Repeatable Read, Phantom Read
- ํด๋น ์ค์ ์ ์ ํฉ์ฑ์ ๋ฌธ์ ๊ฐ ์๊ธฐ ๋๋ฌธ์ ๊ถ์ฅํ๋ ์ค์ ์ ์๋์ง๋ง ๋ค๋ฅธ ๊ฒฉ๋ฆฌ์ฑ ์์ค์ ๋นํด ๋์ ์ฒ๋ฆฌ ์ฑ๋ฅ์ ๊ฐ์ฅ ๋๋ค.
- ์ฐธ๊ณ ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋ ์ธ ๋ ๋ด๋ถ์ ์ผ๋ก Lock์ด ์ฌ์ฉ๋๋ฉฐ DBMS ๋ง๋ค ์ฌ์ฉ๋๋ Lock ๋ฉ์ปค๋์ฆ์ ๋ค๋ฅผ ์ ์๋ค.
# ์ค์ต
[์ธ์
1, 2 ๊ณตํต]
set tx_isolation = 'READ-UNCOMMITTEDโ
SET AUTOCOMMIT = FALSE
START TRNASACTION;
[์ธ์
1]
INSERT INTO EMP VALUES (4, โTestโ, โStudentโ);
[์ธ์
2]
MariaDB [mysql]> SELECT * FROM EMP WHERE ID = 4;
+----+------+---------+
| ID | NAME | JOB |
+----+------+---------+
| 4 | Test | Student |
+----+------+---------+
1 row in set (0.001 sec)
[์ธ์
1]
ROLLBACK;
[์ธ์
2]
MariaDB [mysql]> SELECT * FROM EMP WHERE ID = 4;
Empty set (0.000 sec)
- ์ด์ฒ๋ผ ์ธ์ 1 ํธ๋์ญ์ ์์ ์ฒ๋ฆฌํ ์์ ์ด ์๋ฃ๋์ง ์์์์๋ ๋ถ๊ตฌํ๊ณ (Commit) ์ธ์ 2 ํธ๋์ญ์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ์ ์๋ค.
- ์์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ์ธ์ 1 ํธ๋์ญ์ ์์ ์ฒ๋ฆฌํ ์์ ์ด ์ธ์ 2 ํธ๋์ญ์ ์์๋ ์กฐํ๊ฐ ๋๊ธฐ ๋๋ฌธ์ ์ธ์ 1์์ Rollback์ ํตํด ์ด์ ์ผ๋ก ๋๋ฆฌ๊ฒ ๋๋ฉด ์ธ์ 2๋ ์ด์ ์ ์กฐํํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ๋น์ฆ๋์ค ๋ก์ง์ ์ํํ๊ฒ ๋๋ค.
- ๋ฐ๋ผ์, ์์์ ์ธ๊ธํ๋ ๊ฒฉ๋ฆฌ์ฑ์ผ๋ก ๋ฐ์ํ๋ ๋ฌธ์ ์ค ํ๋์ธ โDirty Readโ ํ์์ด ๋ฐ์ํ๋ค.
(2-2) Read Committed - ์ปค๋ฐ๋ ๊ฒ์ ์ฝ์
ํธ๋์ญ์ ์ด ์ปค๋ฐ๋์ด ํ์ ๋ ๋ฐ์ดํฐ๋ง ๋ค๋ฅธ ํธ๋์ญ์ ์ด ์ฝ๋๋ก ํ์ฉํ๋ค.
- ์ฆ, ์ปค๋ฐ์ด ์๋ฃ๋ ๋ฐ์ดํฐ๋ง ์ฝ์ ์ ์๋ค๋ ๊ฒ์ด๋ค.
- ๋ฐ์ ๋ฌธ์ ์ : Non-Repeatable Read, Phantom Read
- ์ปค๋ฐ๋์ง ์์ ๋ฐ์ดํฐ์ ๋ํด์๋ ์ค์ DB ๋ฐ์ดํฐ๊ฐ ์๋ UNDO ๋ก๊ทธ์ ์๋ ์ด์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ฒ ๋๋ค.
- Uncommitted Read ์์ค์ ๋นํด ๋์ ์ฒ๋ฆฌ ์ฑ๋ฅ์ ๋จ์ด์ง๋ Dirty Read๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ ์๋ค.
- ํ์ง๋ง ์ฌ์ ํ Non-Repeatable Read์ Phantom Read์ ๋ํด์๋ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์๋ค.
- ์ฐธ๊ณ ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋ ์ธ ๋ ๋ด๋ถ์ ์ผ๋ก Lock์ด ์ฌ์ฉ๋๋ฉฐ DBMS ๋ง๋ค ์ฌ์ฉ๋๋ Lock ๋ฉ์ปค๋์ฆ์ ๋ค๋ฅผ ์ ์๋ค.
[์ฐธ๊ณ ] UNDO ๋ก๊ทธ
- Mysql, MariaDB์์ ์ฌ์ฉ๋๋ InnoDB ์คํ ๋ฆฌ์ง ์์ง์ ํธ๋์ญ์ ์ด Rollback ๋ ๊ฐ๋ฅ์ฑ์ ๋๋นํด ๋ณ๊ฒฝ๋๊ธฐ ์ ๋ ์ฝ๋๋ฅผ UNDO ๊ณต๊ฐ์ ๋ฐฑ์ ํด๋๊ณ ์ค์ ๋ ์ฝ๋ ๊ฐ์ ๋ณ๊ฒฝํ๋ค.
- ์ด๋ฌํ ๋ณ๊ฒฝ ๋ฐฉ์์ MVCC (Multi-Version Concurrency Control) ์ด๋ผ๊ณ ํ๋ค.
- ์ฆ, Read-UnCommitted๋ ๋ฐ์ดํฐ ํ์ผ์์ ๋ฐ์ดํฐ๋ฅผ ์ง์ ์ฝ์ด์ค๋ฉฐ Read-Committed๋ ๋ฐ์ดํฐ ํ์ผ์ด ์ปค๋ฐ๋์ง ์์ ๋ฐ์ดํฐ์ผ ๊ฒฝ์ฐ UNDO ๋ก๊ทธ์์ ์ต์ UNDO ๋ ์ฝ๋๋ฅผ ์ฝ์ด์ค๋ ๊ฒ์ด๋ค.
- ์ ๋ฆฌํ์๋ฉด UNDO ๋ก๊ทธ๋ โํธ๋์ญ์ ์ ๋กค๋ฐฑ ๋๋น์ฉโ, โํธ๋์ญ์ ์ ๊ฒฉ๋ฆฌ ์์ค์ ์ ์งํ๋ฉฐ ๋์ ๋์์ฑ ์ ๊ณตโ ์ฉ๋๋ก ์ฌ์ฉ๋๋ค.
# ์ค์ต
[์ธ์
1, 2 ๊ณตํต]
set tx_isolation = 'READ-COMMITTED';
SET AUTOCOMMIT = FALSE
START TRNASACTION;
[์ธ์
2]
MariaDB [mysql]> SELECT * FROM EMP;
+----+-------+---------+
| ID | NAME | JOB |
+----+-------+---------+
| 1 | userA | Student |
| 2 | userB | Student |
| 3 | userC | Student |
+----+-------+---------+
3 rows in set (0.000 sec)
[์ธ์
1]
UPDATE EMP SET NAME = โmodifiedโ WHERE ID = 3;
[์ธ์
2]
MariaDB [mysql]> SELECT * FROM EMP;
+----+-------+---------+
| ID | NAME | JOB |
+----+-------+---------+
| 1 | userA | Student |
| 2 | userB | Student |
| 3 | userC | Student |
+----+-------+---------+
3 rows in set (0.000 sec)
โ Dirty Read ํ์์ ๋ฐ์ํ์ง ์์์ ํ์ธํ ์ ์๋ค.
[์ธ์
1]
COMMIT;
[์ธ์
2]
MariaDB [mysql]> SELECT * FROM EMP;
+----+----------+---------+
| ID | NAME | JOB |
+----+----------+---------+
| 1 | userA | Student |
| 2 | userB | Student |
| 3 | modified | Student |
+----+----------+---------+
3 rows in set (0.000 sec)
- ์ด์ฒ๋ผ ์ธ์ 1 ํธ๋์ญ์ ์์ ๋ฐ์ดํฐ๊ฐ ์์ ๋์์ง๋ง Commit์ด ์๋๊ธฐ ๋๋ฌธ์ ์ธ์ 2 ํธ๋์ญ์ ์์๋ ์์ ๋ ๋ฐ์ดํฐ๋ก ์กฐํ๋์ง ์๋๋ค.
- ๋ฐ๋ผ์, Dirty Read ๋ฌธ์ ๋ ํด๊ฒฐ๋์์ง๋ง ์ธ์ 2 ํธ๋์ญ์ ์ EMP ํ ์ด๋ธ์ ID = 3๋ฒ์ธ ROW๋ฅผ ๋ ๋ฒ SELECT ํ๋๋ฐ ๋ ๋ฒ์งธ SELECT์ ํ๊ธฐ ์ ์ ์ธ์ 1 ํธ๋์ญ์ ์์ ํด๋น ROW๋ฅผ ์์ ํ๊ณ COMMIT ํ๊ธฐ ๋๋ฌธ์ ์ธ์ 2 ํธ๋์ญ์ ์์์ ์ฒซ ๋ฒ์งธ SELECT์ ๋ ๋ฒ์งธ SELECT์ ๊ฒฐ๊ณผ๊ฐ ๋ค๋ฅด๊ฒ ๋์ค๋ Non-Repeatable Read ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
- ๊ทธ ์ธ์๋ ์ธ์ 1 ํธ๋์ญ์ ์์ UPDATE๋ฌธ์ด ์๋ INSERT๋ฌธ์ ์ฌ์ฉํ์๋ค๋ฉด Phantom Read ํ์ ๋ํ ๋ฐ์ํ๊ฒ ๋๋ค.
(2-3) Repeatable Read โ ๋ฐ๋ณต์ ์ผ๋ก ์ฝ์
ํธ๋์ญ์ ๋ด์์ ์ญ์ , ๋ณ๊ฒฝ์ ๋ํด์๋ UNDO ๋ก๊ทธ์ ๋ฃ์ด๋๊ณ , ์์ ๋ฐ์ํ ํธ๋์ญ์ ์ ๋ํด์๋ ์ค์ ๋ฐ์ดํฐ๊ฐ ์๋ UNDO ๋ก๊ทธ์ ์๋ ๋ฐฑ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋๋ก ํ๋ค.
- ๋ฐ๋ผ์, ๊ฐ์ ๋ณ๊ฒฝ์ ๋ํด์ ์ผ์ ํ ๊ฐ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๊ธฐ ๋๋ฌธ์ ์ญ์ ์ ์์ ์ ๋ํด์ ํธ๋์ญ์ ๋ด์ ๋ถ์ผ์น๋ฅผ ๊ฐ์ ธ์ค๋ Non-Repeatable Read ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
- ์ฆ, ํธ๋์ญ์ ๋ด์์ ํ ๋ฒ ์กฐํํ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ณตํด์ ์กฐํํด๋ ๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์กฐํ๋๋ค๋ ๊ฒ์ด๋ค.
- ๋ฐ์ ๋ฌธ์ ์ : Phantom Read
- ์ฐธ๊ณ ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋ ์ธ ๋ ๋ด๋ถ์ ์ผ๋ก Lock์ด ์ฌ์ฉ๋๋ฉฐ DBMS ๋ง๋ค ์ฌ์ฉ๋๋ Lock ๋ฉ์ปค๋์ฆ์ ๋ค๋ฅผ ์ ์๋ค.
# ์ค์ต
[์ธ์
1, 2 ๊ณตํต]
set tx_isolation = 'REPEATABLE-READโ
SET AUTOCOMMIT = FALSE
START TRNASACTION;
[์ธ์
2]
MariaDB [mysql]> SELECT * FROM EMP;
+----+-------+---------+
| ID | NAME | JOB |
+----+-------+---------+
| 1 | userA | Student |
| 2 | userB | Student |
| 3 | userC | Student |
+----+-------+---------+
3 rows in set (0.000 sec)
[์ธ์
1]
UPDATE EMP SET NAME = โmodifiedโ WHERE ID = 3;
COMMIT;
[์ธ์
2]
MariaDB [mysql]> select * from emp;
+----+-------+---------+
| ID | NAME | JOB |
+----+-------+---------+
| 1 | userA | Student |
| 2 | userB | Student |
| 3 | userC | Student |
+----+-------+---------+
3 rows in set (0.000 sec)
[์ธ์
1]
INSERT INTO EMP VALUES (4, โTestโ, โStudentโ);
COMMIT;
[์ธ์
2]
MariaDB [mysql]> select * from emp;
+----+-------+---------+
| ID | NAME | JOB |
+----+-------+---------+
| 1 | userA | Student |
| 2 | userB | Student |
| 3 | userC | Student |
+----+-------+---------+
3 rows in set (0.000 sec)
[์ธ์
2]
COMMIT;
MariaDB [mysql]> select * from emp;
+----+----------+---------+
| ID | NAME | JOB |
+----+----------+---------+
| 1 | userA | Student |
| 2 | userB | Student |
| 3 | modified | Student |
| 4 | Test | Student |
+----+----------+---------+
4 rows in set (0.000 sec)
- ์ด์ฒ๋ผ ์ธ์ 1 ํธ๋์ญ์ ์์ ํน์ ROW์ ๋ฐ์ดํฐ๊ฐ ์์ (์ญ์ ) + Commit ๋์ด๋ ์ธ์ 2 ํธ๋์ญ์ ์์๋ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๊ธฐ ์ ์ ๋ฐ์ดํฐ๋ก ์กฐํ๊ฐ ๋๋ค.
- ์ฆ, ํธ๋์ญ์ ๋ด์์ ํ ๋ฒ ์กฐํํ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ณตํด์ ์กฐํํด๋ ๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์กฐํ๋๋ค๋ ๊ฒ์ด๋ค.
- ๋ฐ๋ผ์, โRead Committedโ ๊ฒฉ๋ฆฌ์ฑ ์์ค์์ ๋ฐ์ํ๋ Non-Repeatable Read ๋ฌธ์ ๋ ํด๊ฒฐ์ด ๋์๋ค.
- ์ด๋ ์ธ์ 1 ํธ๋์ญ์ ์์ ๋ฐ์ดํฐ๊ฐ ์์ /์ญ์ + Commit ๋๋๋ผ๋ ์ธ์ 2 ํธ๋์ญ์ ์์๋ ์ค์ ๋ฐ์ดํฐ๊ฐ ์๋ ์ธ์ 1 ํธ๋์ญ์ ์์ UNDO ๋ก๊ทธ์ ์ ์ฅํ ๋ฐฑ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ๋๋ฌธ์ด๋ค.
- ๋ค๋ง, ์ธ์ 1 ํธ๋์ญ์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐ(INSERT) ๋ฐ Commit ํ๊ฒ ๋๋ฉด ์ธ์ 2 ํธ๋์ญ์ ์์ Phantom Read ๋ฌธ์ ๊ฐ ๋ฐ์ํด์ผ ํ์ง๋ง InnoDB ์คํ ๋ฆฌ์ง ์์ง์ ๋ฅ์คํธ ํค ๋ฝ์ ์ด์ฉํ์ฌ Phantom Read ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ๋๋ฌธ์ Phantom Read ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
(2-4) Serializable Read - ์ง๋ ฌํ๊ฐ ๊ฐ๋ฅ (์ฌ๋ฌ ํธ๋์ญ์ ์ด ์ค์์ ๊ธฐ๋ค๋ฆฌ๋ฉฐ ํ๋์ฉ ์ฒ๋ฆฌ๋จ)
ํธ๋์ญ์ ๋ด์์ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฒ ์ด์ ์ํํ ๋, ์ฒซ ๋ฒ์งธ ์ฟผ๋ฆฌ์ ์๋ ๋ ์ฝ๋๊ฐ ์ฌ๋ผ์ง๊ฑฐ๋ ๊ฐ์ด ๋ฐ๋์ง ์์์ ๋ฌผ๋ก ์๋ก์ด ๋ ์ฝ๋๊ฐ ๋ํ๋์ง๋ ์๋๋ก ํ๋ค.
- ๊ฐ์ฅ ๋จ์ํ ๊ฒฉ๋ฆฌ ์์ค์ด๋ฉด์ ๊ฐ์ฅ ์๊ฒฉํ ๊ฒฉ๋ฆฌ ์์ค์ผ๋ก ๊ฒฉ๋ฆฌ์ฑ์ผ๋ก ์ธํด ๋ฐ์ํ ์ ์๋ 3๊ฐ์ง ๋ฌธ์ ๋ฅผ ๋ชจ๋ ์ปค๋ฒ ๊ฐ๋ฅํ์ง๋ง ๋ค๋ฅธ ํธ๋์ญ์ ๊ฒฉ๋ฆฌ์ฑ ์์ค๋ณด๋ค ๋์ ์ฒ๋ฆฌ ์ฑ๋ฅ์ ํ์ ํ ๋จ์ด์ง๋ค.
- ํ ํธ๋์ญ์ ์์ ์ฝ๊ณ ์ฐ๋ ๋ ์ฝ๋๋ฅผ ๋ค๋ฅธ ํธ๋์ญ์ ์์๋ ๊ฒฉ๋ฆฌ์ฑ ์ ์ ๊ทธ๋๋ก ์ ๋ ์ ๊ทผํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ ํธ๋์ญ์ ์ด ์ค์์ ํ๋์ฉ ์ฒ๋ฆฌ๋๋ค.
- ๋ค๋ง ์ผ๋ฐ์ ์ธ DBMS์์๋ Serializable Read ์์ค์์๋ Phantom Read ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์ง๋ง InnoDB ์คํ ๋ฆฌ์ง ์์ง์ ์ฌ์ฉํ๋ DBMS์์๋ Repeatable Read ๊ฒฉ๋ฆฌ ์์ค์์๋ Phantom Read๊ฐ ๋ฐ์ํ์ง ์๊ธฐ ๋๋ฌธ์ ๊ตณ์ด Serializable Read ๊ฒฉ๋ฆฌ ์์ค์ ์ฌ์ฉํ ํ์์ฑ์ ์๋ค.
- ์ฐธ๊ณ ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋ ์ธ ๋ ๋ด๋ถ์ ์ผ๋ก Lock์ด ์ฌ์ฉ๋๋ฉฐ DBMS ๋ง๋ค ์ฌ์ฉ๋๋ Lock ๋ฉ์ปค๋์ฆ์ ๋ค๋ฅผ ์ ์๋ค.
# ์ค์ต
[์ธ์
1, 2 ๊ณตํต]
set tx_isolation = 'SERIALIZABLEโ;
SET AUTOCOMMIT = FALSE
START TRNASACTION;
[์ธ์
2]
MariaDB [mysql]> select * from emp;
+----+-------+---------+
| ID | NAME | JOB |
+----+-------+---------+
| 1 | userA | Student |
| 2 | userB | Student |
| 3 | userC | Student |
+----+-------+---------+
3 rows in set (0.000 sec)
[์ธ์
1]
INSERT INTO EMP VALUES (4, โTestโ, โStudentโ);
โ ์ธ์
2 ํธ๋์ญ์
์์ ํด๋น ํ
์ด๋ธ์ Lock์ ๊ฑธ์ด๋์๊ธฐ์ ํด๋น INSERT๋ฌธ์ ์คํ๋์ง ์๊ณ ๋๊ธฐ ์ํ๋ก ๋น ์ง๊ฒ ๋๋ค.
UPDATE EMP SET NAME = โmodifiedโ WHERE ID = 3;
โ UPDATE๋ฌธ ๋ํ ๋ง์ฐฌ๊ฐ์ง๋ก ํด๋น ํ
์ด๋ธ์ Lock์ด ๊ฑธ๋ ค์์ด ํด๋น UPDATE๋ฌธ์ ์คํ๋์ง ์๊ณ ๋๊ธฐ ์ํ๋ก ๋น ์ง๊ฒ ๋๋ค.
[์ ๋ฆฌ]

- ์ฌ์ฉํ๋ DBMS์์ ์ด๋ค ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค์ ์ ๊ณตํ๊ณ , ๊ฐ ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค์์ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ๋ฅผ ์ธ์งํ๋ ๊ฒ์ ๋งค์ฐ ์ค์ํ๋ค!
- ์์ ๊ทธ๋ฆผ์์ Repeatable Read ๊ฒฉ๋ฆฌ ์์ค์ InnoDB ์์ง์ ์ฌ์ฉํ ๊ฒฝ์ฐ, Phantom Read ๋ฌธ์ ๋ ๋ฐ์ํ์ง ์๋๋ค.
[์ฐธ๊ณ ] ํธ๋์ญ์ ๊ฒฉ๋ฆฌ์ฑ ์์ค๊ณผ DB Lock์ ์๊ด๊ด๊ณ
- ํธ๋์ญ์ ๊ฒฉ๋ฆฌ์ฑ ์์ค๊ณผ DB Lock์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํธ๋์ญ์ ๊ด๋ฆฌ์์ ์ค์ํ ๊ฐ๋ ์ผ๋ก, ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ๊ณผ ๋์์ฑ์ ์กฐ์ ํ๋ ๋ฐ์ ์ฌ์ฉ๋์ด์ง๋ค.
- ๊ฒฉ๋ฆฌ์ฑ ์์ค๊ณผ DB Lock์ ๋น์ทํ ๊ฐ๋ ์ฒ๋ผ ๋ณด์ผ ์ ์์ง๋ง ์๋ก ๋ค๋ฅธ ๊ฐ๋ ์ด๊ณ ์๋์ ๊ฐ์ ์ฐจ์ด์ ์ด ์๋ค.
โ ๊ฐ๋
์ ์ฐจ์ด
ํธ๋์ญ์
๊ฒฉ๋ฆฌ์ฑ ์์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฌ๋ฌ ํธ๋์ญ์
๋ค์ด ๋์์ ์คํ๋ ๋, ์๋ก์๊ฒ ์ด๋ป๊ฒ ์ํฅ์ ๋ฏธ์น๋ ์ง๋ฅผ ๊ฒฐ์ ํ๋ ์ค์ ์ผ๋ก ๊ฒฉ๋ฆฌ์ฑ ์์ค์ ํธ๋์ญ์
๋ค ๊ฐ์ ๋์ ์ ๊ทผ๊ณผ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๋๋ฐ ์ฌ์ฉ๋๋ค.
DB Lock์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฌ๋ฌ ํธ๋์ญ์ ๋ค์ด ๋์์ ๋ฐ์ดํฐ์ ์ ๊ทผํ ๋, ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ๋ฉ์ปค๋์ฆ์ผ๋ก Lock์ ํธ๋์ญ์ ๋ค์ด ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋ ์ฐ๋ ๋์ ๋ค๋ฅธ ํธ๋์ญ์ ๋ค์ด ํด๋น ๋ฐ์ดํฐ์ ๋ํ ์ ๊ทผ์ ์ ํํจ์ผ๋ก์จ ๋์์ฑ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๋ค.
โก ์ ์ฉ ๋ฒ์
ํธ๋์ญ์
๊ฒฉ๋ฆฌ์ฑ ์์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ฒด์ ์ ์ฉ๋๋ ์ค์ ์ด๋ฉฐ, ๊ฐ ํธ๋์ญ์
์ ์ด ๊ฒฉ๋ฆฌ์ฑ ์์ค์ ๋ฐ๋ผ ๋์ํ๋ค.
๊ฒฉ๋ฆฌ์ฑ ์์ค์ ํธ๋์ญ์ ์ ์์ ์์ ์ ์ค์ ๋๋ฉฐ, ํด๋น ํธ๋์ญ์ ์ ์ํ ๋์ค์ ๋ณ๊ฒฝ๋์ง ์๋๋ค.
DB Lock์ ๊ฐ๋ณ ๋ฐ์ดํฐ๋ ๋ฐ์ดํฐ ๋ธ๋ก์ ์ ์ฉ๋๋ Lock ๋ฉ์ปค๋์ฆ์ผ๋ก ํน์ ํธ๋์ญ์ ์ด ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋ ์ฐ๊ธฐ ์ํด ํด๋น ๋ฐ์ดํฐ์ ๋ํ Lock์ ํ๋ํ๊ณ ์์ ์ด ์๋ฃ๋ ํ์ Lock์ ํด์ ํ๋ค.
โข ์๋๊ด๋ฆฌ vs ์๋๊ด๋ฆฌ
ํธ๋์ญ์
๊ฒฉ๋ฆฌ์ฑ ์์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ
์ด ์๋์ผ๋ก ๊ด๋ฆฌํ๋ ์ค์ ์ด๋ฉฐ ๊ฐ๋ฐ์๊ฐ ์ง์ ๋ฝ์ ์ค์ ํ๊ฑฐ๋ ํด์ ํ ํ์๊ฐ ์๋ค.
DB ๋ฝ์ ๊ฐ๋ฐ์๊ฐ ํน์ ๋ฐ์ดํฐ์ ๋ํด Lock์ ์๋์ผ๋ก ์ค์ ํ๊ณ ํด์ ํด์ผ ํ๋ค.
โฃ ๋์์ฑ๊ณผ ์ผ๊ด์ฑ ๋ณด์ฅ
ํธ๋์ญ์
๊ฒฉ๋ฆฌ์ฑ ์์ค์ ํธ๋์ญ์
๋ค ๊ฐ์ ๋์ ์ ๊ทผ๊ณผ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๋๋ฐ ์ฌ์ฉ๋๋ฉฐ, ๊ฒฉ๋ฆฌ์ฑ ์์ค์ ๋์ผ์๋ก ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ๋ณด์ฅ๋์ง๋ง ๋์์ฑ์ ๊ฐ์ํ ์ ์๋ค.
DB Lock์ ๋์์ฑ์ ๊ด๋ฆฌํ์ฌ ์ฌ๋ฌ ํธ๋์ญ์ ์ด ๋ฐ์ดํฐ๋ฅผ ๋์์ ์ ๊ทผํ๋ ๊ฒ์ ์ ์ดํจ์ผ๋ก์จ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๋ค.
โ ์์ฝํ์๋ฉด ํธ๋์ญ์ ๊ฒฉ๋ฆฌ์ฑ ์์ค๊ณผ DB ๋ฝ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋์์ฑ๊ณผ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ๊ด๋ฆฌํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๊ฐ๋ ์ด๋ค!
โ ํธ๋์ญ์ ๊ฒฉ๋ฆฌ์ฑ ์์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ฒด์ ์ ์ฉ๋๋ ์ค์ ์ผ๋ก, ๊ฒฉ๋ฆฌ์ฑ ๋ ๋ฒจ์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋์ ์ ๊ทผ์ ์กฐ์ ํ๊ธฐ ์ํด DB Lock์ ์ค์ ํ๊ณ ํด์ ํ๋ค.
โ DB Lock์ ์ค์ ๊ณผ ํด์ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ ๋ด๋ถ์์ ์๋์ผ๋ก ์ฒ๋ฆฌํ๋ฉฐ ๊ฐ๊ฐ์ ๊ฒฉ๋ฆฌ์ฑ ๋ ๋ฒจ์ ๋ฐ๋ผ ์ฌ์ฉ๋๋ DB Lock ๋ฉ์ปค๋์ฆ์ DBMS๋ง๋ค ๋ค๋ฅผ ์ ์๋ค.
โ ์ฆ, ๊ฒฉ๋ฆฌ์ฑ ๋ ๋ฒจ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฌ์ฉ๋๋ DB Lock์ ์ข ๋ฅ์ ๋์ ๋ฐฉ์์ ๊ฒฐ์ ํ๋ฉฐ ๊ฐ ๊ฒฉ๋ฆฌ์ฑ ๋ ๋ฒจ์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ฝ๊ธฐ์ ์ฐ๊ธฐ์ ์ด๋ค DB Lock์ ์ฌ์ฉํ ์ง ์๋์ผ๋ก ์ค์ ํ๊ณ ๊ฒฉ๋ฆฌ์ฑ ๋ ๋ฒจ์ด ๋์์๋ก ๋ ๊ฐ๋ ฅํ DB Lock์ด ์ฌ์ฉ๋๋ฉฐ ๋์ ์ ๊ทผ์ด ์ ํ๋๊ณ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ด ๋ณด์ฅ๋์ด์ง๋ค.
โ ๋ฐ๋ผ์, ์ ์ ํ ๊ฒฉ๋ฆฌ์ฑ ๋ ๋ฒจ์ ์ค์ ํจ์ผ๋ก์จ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ ์ด ์์์ DB Lock์ ๊ด๋ฆฌํ๊ฒ ๋๋ฏ๋ก ๊ฐ๋ฐ์๋ ๊ฒฉ๋ฆฌ์ฑ ๋ ๋ฒจ๋ง ์ ์ ํ ์ ํํ์ฌ ํธ๋์ญ์ ์ ๋์์ฑ๊ณผ ์ผ๊ด์ฑ์ ์กฐ์ ํ๋ฉฐ Lock ๊ด๋ฆฌ์ ์ ๊ฒฝ์ฐ์ง ์๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์กฐ์์ ์ง์คํ ์ ์๋ค.
โ ๋ค๋ง, ๋งํ๋ค์ํผ ๊ฒฉ๋ฆฌ์ฑ ์์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ฒด์ ์ ์ฉ๋๋ ์ค์ ์ด๋ฏ๋ก ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ์ํด ๋์ ๊ฒฉ๋ฆฌ์ฑ ์์ค์ ์ฌ์ฉํ๊ฒ ๋๋ฉด ๋์์ฑ์ด ๊ฐ์ํ ์ ์์ผ๋ฏ๋ก ์ฑ๋ฅ์ ๊ฐ์ํ์ฌ ์ ์ ํ ๊ฒฉ๋ฆฌ์ฑ ๋ ๋ฒจ์ ์ ํํ๊ณ ํ์์ ์ผ๋ก ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ด ๋ณด์ฅ๋์ด์ผ ํ๋ ํ ์ด๋ธ[๋ฐ์ดํฐ]์ ํํด ๊ฐ๋ฐ์๊ฐ ์๋์ผ๋ก DB ๋ฝ์ ์ค์ ํ๋ค.
[Reference]
https://armful-log.tistory.com/57
[DB] ํธ๋์ญ์ ํน์ง, ๊ฒฉ๋ฆฌ ์์ค, ๊ด๋ จ ๋ฌธ์ ์
_ํธ๋์ญ์ ์ด ๋ณด์ฅํด์ผ ํ๋ ACID Atomicity(์์์ฑ) : ํ ํธ๋์ญ์ ๋ด์์ ์คํํ ์์ ๋ค์ ํ๋์ ์์ ์ผ๋ก ๊ฐ์ฃผ. ๋ชจ๋ ์ฑ๊ณต ๋๋ ์คํจ๋์ด์ผ ํ๋ค. Consistency(์ผ๊ด์ฑ) : ๋ชจ๋ ํธ๋์ญ์ ์ ์ผ๊ด์ฑ ์๋
armful-log.tistory.com
DB ํธ๋์ญ์ - ๊ฒฉ๋ฆฌ์์ค(Transaction Isolation Level)
ํธ๋์ญ์ DB์์์ ํธ๋์ญ์ ์ด๋, ๋ณดํต ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ด๋ค ๋ณ๊ฒฝ์ ์ ๋ฐํ๋ ์์ ๋จ์๋ฅผ ์๋ฏธํ๋ค. ๋ ผ๋ฆฌ์ ์ผ๋ก ํ ๊ฐ์ ์คํ ๋จ์๋ฅผ ๋ปํ๋ฉฐ, ๋ฌผ๋ฆฌ์ ์ผ๋ก๋ ํ ๊ฐ ํน์ ์ฌ๋ฌ ๊ฐ์ ์คํ๋จ์๊ฐ
luran.me
https://sabarada.tistory.com/117
[๋ฐ์ดํฐ๋ฒ ์ด์ค] ํธ๋์ญ์ ๊ณผ ๊ฒฉ๋ฆฌ์ฑ
์๋ ํ์ธ์. ํ์์ ํฌ์คํ ํ๋ ๋ด์ฉ๊ณผ๋ ์กฐ๊ธ ๋จ์ด์ง ์ด๋ก ์ ์ธ ๋ด์ฉ์ ํฌ์คํ ํ๊ณ ์ ํฉ๋๋ค. DB๋ ํธ๋์ญ์ ๋จ์๋ก ์ฒ๋ฆฌ๋๋ค๊ณ ํฉ๋๋ค. ์ ๋ช ํ All Or Nothing์ด DB์ ํธ๋์ญ์ ์์ ๋์จ ์ด์ผ๊ธฐ์
sabarada.tistory.com
https://incheol-jung.gitbook.io/docs/q-and-a/db/isolation-level
Isolation level - Incheol's TECH BLOG
ํธ๋์ญ์ (Transaction A) ์ค์ ํน์ ์กฐ๊ฑด์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ์ป์๋ค. ์ด๋ ๋ค๋ฅธ ํธ๋์ญ์ (Transaction B)๊ฐ ์ ๊ทผํด ํด๋น ์กฐ๊ฑด์ ๋ฐ์ดํฐ ์ผ๋ถ๋ฅผ ์ญ์ ๋๋ ์ถ๊ฐํ์๋, ์์ง ๋๋์ง ์์ Transac
incheol-jung.gitbook.io
ํธ๋์ญ์ ๊ณผ ๊ฒฉ๋ฆฌ ๋ ๋ฒจ ๊ทธ๋ฆฌ๊ณ Lock์ ๋ํ์ฌ
* ํ์ต์ ๋์์ ์ฃผ์ ์คํฐ๋์ ์ค๊ธธํ๋๊ป ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ํธ๋์ญ์ (Transaction) ์ํคํผ๋์์ ์ค๋ช ํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํธ๋์ญ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ ์์คํ ๋๋ ์ ์ฌํ ์์คํ ์์ ์ํธ์์ฉ์ ๋จ
jordy-torvalds.tistory.com
https://zzang9ha.tistory.com/381
[MySQL] - ํธ๋์ญ์ ์ ๊ฒฉ๋ฆฌ ์์ค(Isolation level)
๐ ๊ธ๋ 6๊ธฐ ํฌ์คํ 1. ๋ฏธ์น๋๋ก ๋์ ๋ 7์์ ํ๊ณ 2. ์ฌ์ฉ์๊ฐ ๊ฒ์๋ฌผ์ ์์ฑํ ๋์ ํธ๋์ญ์ ์ฒ๋ฆฌ 3. Spring AOP - (1) ํ๋ก์ ํจํด, ๋ฐ์ฝ๋ ์ดํฐ ํจํด 4. [MySQL] - ํธ๋์ญ์ ์ ๊ฒฉ๋ฆฌ ์์ค(Isolation level) 5
zzang9ha.tistory.com
https://overcome-the-limits.tistory.com/528
[๋ฐ์ดํฐ๋ฒ ์ด์ค] ํธ๋์ญ์
๋ค์ด๊ฐ๋ฉฐ SOPT์์ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์, Sequelize ORM์ ํ์ฉํด์ ํ๋ก์ ํธ๋ฅผ ๊ด๋ฆฌํ์ต๋๋ค. ํ์ง๋ง Sequelize๋ฅผ ํ์ฉํ๋ค ๋ณด๋, SQL์ ์๋ฆฌ์ ๋ํด์ ์ ๋๋ก ์ ์ ์์์ต๋๋ค. Sequelize์ ๋ฌธ์ ๊ฐ ์
overcome-the-limits.tistory.com
- ChatGPT ํฌํจ
'๐จโ๐ป Back End > MySQL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
DB Lock ์ฌํ (์ด๋ ค์ด ๋ถ๋ถ์ด ๋๋ฌด ๋ง์....์์ฑ์ค....) (0) | 2023.07.30 |
---|---|
DB Lock ๊ธฐ์ด (0) | 2023.07.30 |
ํธ๋์ญ์ (Transaction) (0) | 2023.07.22 |
๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ ์ ์ฝ ์กฐ๊ฑด (0) | 2023.07.22 |
Join (์กฐ์ธ) - ๋ด๋ถ ์กฐ์ธ (Inner Join) & ์ธ๋ถ ์กฐ์ธ (Outer Join) (0) | 2023.07.22 |