1) ํธ๋์ญ์ (Transaction)
(1) ํธ๋์ญ์ ์ด๋
- ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํ๋ฅผ ๋ณํ์ํค๋ ํ๋์ ๋ ผ๋ฆฌ์ ๊ธฐ๋ฅ์ ์ํํ๊ธฐ ์ํ ์์ ์ ๋จ์ ๋๋ ํ๊บผ๋ฒ์ ์ํ๋์ด์ผํ ์ผ๋ จ์ ์ฐ์ฐ๋ค์ ์๋ฏธํ๋ค.
- ์๋ฅผ ๋ค์ด, MySQL์์ ๋ฐ์ดํฐ ์ํ๋ฅผ ๋ฐ๊พธ๋ INSERT, DELETE, UPDATE ๋ฑ์ SQL ๋ช ๋ น์ด๋ค์ ๊ฐ๊ฐ ํ๋์ ํธ๋์ญ์ ์ด๋ผ๊ณ ๋ณผ ์ ์์ผ๋ฉฐ ์ฌ๋ฌ ๋ช ๋ น์ด๋ฅผ ํ๋์ ํธ๋์ญ์ ์ผ๋ก ๋ฌถ๊ณ ์ ํ๋ค๋ฉด “START TRANSACTION”์ผ๋ก ๋ฌถ์ ์ ์๋ค.
(2) ํธ๋์ญ์ ์ ํน์ฑ
- ์์์ฑ (Atomicity)
ํธ๋์ญ์ ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ชจ๋ ๋ฐ์๋๋์ง, ์๋๋ฉด ์ ํ ๋ฐ์๋์ง ์๋ ๊ฒ์ ์์์ฑ์ด๋ผ๊ณ ํ๋ค.
ํธ๋์ญ์ ๋ด์ ๋ชจ๋ ๋ช ๋ น์ ๋ฐ๋์ ์๋ฒฝํ ์ํ๋์ด์ผ ํ๋ฉฐ, ๋ชจ๋๊ฐ ์๋ฒฝํ ์ํ๋์ง ์๊ณ ์ด๋ ํ๋๋ผ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ํธ๋์ญ์ ์ ๋ถ๊ฐ ์ทจ์๋์ด์ผ ํ๋ค.
- ์ผ๊ด์ฑ (Consistency)
ํธ๋์ญ์ ์ ์์ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ ํญ์ ์ผ๊ด์ฑ์ด ์์ด์ผ ํ๋ค.
ํธ๋์ญ์ ์ด ์งํ๋๋ ๋์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๋ณ๊ฒฝ๋๋๋ผ๋ ์ ๋ฐ์ดํธ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ํธ๋์ญ์ ์ด ์งํ๋๋ ๊ฒ์ด ์๋๋ผ, ์ฒ์์ ํธ๋์ญ์ ์ ์งํํ๊ธฐ ์ํด ์ฐธ์กฐํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ์งํ๋๋ค.
- ๊ฒฉ๋ฆฌ์ฑ (Isolation)
๋ ์ด์์ ํธ๋์ญ์ ์ด ๋์์ ์คํ๋๊ณ ์์ ๊ฒฝ์ฐ, ์ด๋ค ํ๋์ ํธ๋์ญ์ ์ด๋ผ๋ ๋ค๋ฅธ ํธ๋์ญ์ ์ ์ฐ์ฐ์ ๋ผ์ด๋ค ์ ์๋ค.
์ํ ์ค์ธ ํธ๋์ญ์ ์ ์์ ํ ์๋ฃ๋ ๋๊น์ง ๋ค๋ฅธ ํธ๋์ญ์ ์์ ์ํ ๊ฒฐ๊ณผ๋ฅผ ์ฐธ์กฐํ ์ ์๋ค.
- ์ง์์ฑ (Durability)
ํธ๋์ญ์ ์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋์์ ๊ฒฝ์ฐ, ๊ฒฐ๊ณผ๋ ์๊ตฌ์ ์ผ๋ก ๋ฐ์๋์ด์ผ ํ๋ค.
(3) ํธ๋์ญ์ ์ํ
- ํธ๋์ญ์ ์ ์ฐ์ฐ๊ณผ์ ์ ๋จ๊ณ๋ฅผ ๋์ํํ์ฌ ๊ฐ๊ฐ์ ๋จ๊ณ์ ์ํ๋ฅผ ์๋์ ๊ฐ์ด ์ ๋ฆฌํด๋ณผ ์ ์๋ค.
- ํ์ฑ(Active) : ํธ๋์ญ์ ์ด ์ ์์ ์ผ๋ก ์คํ์ค์ธ ์ํ๋ฅผ ์๋ฏธ
ํธ๋์ญ์ ์ด ์์๋๋ฉด, ํด๋น ํธ๋์ญ์ ์ ์ํ๋ ํ๋(Active)์ํ๊ฐ ๋๊ณ , ํด๋น ์ํ๋ ์ค๊ณ์๊ฐ ์ค๊ณํ ๋๋ก ์ฐ์ฐ๋ค์ด ์ ์์ ์ผ๋ก ์คํ ์ค์ธ ์ํ๋ฅผ ์๋ฏธํ๋ค.
[์์ ์ฑ๊ณต ์]
- ๋ถ๋ถ ์๋ฃ(Partially Committed) : ํธ๋์ญ์ ์ ๋ง์ง๋ง๊น์ง ์คํ๋์์ง๋ง, Commit ์ฐ์ฐ ์คํ๋๊ธฐ์ ์ ์ํ
- ์๋ฃ(Committed) : ํธ๋์ญ์ ์ด ์ฑ๊ณต์ด ์ข ๋ฃ๋์ด Commit ์ฐ์ฐ์ ์คํํ ํ์ ์ํ
์ค๊ณ๋ ํธ๋์ญ์ ๋๋ก ๋ช ๋ น์ด ์ฑ๊ณต์ ์ผ๋ก ์ํ๋๋ฉด ๊ทธ ๋ค์ ์ํ๋ ๋ถ๋ถ์ ์๋ฃ (Partially Committed) ์ํ๊ฐ ๋๊ณ ์ค๊ณ๋ ์์ ๋๋ก ์์ ์ด ์ฑ๊ณตํ์๋ค ํ๋๋ผ๋ ๋ฌด์กฐ๊ฑด ๋ฐ์ํ๋ ๊ฒ์ด ์๋๋ผ ์ค๊ณ์์ ์ต์ข ์น์ธ (Commit)์ด ์์ ๋๊น์ง ์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์ ๋ด์ฉ์ ๋ฐ์ํ์ง ์๊ณ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ด๋ค.
์ค๊ณ์๊ฐ ์์ ๊ฒฐ๊ณผ์ ๋ํ์ฌ ๋ฐ์์ ์น์ธ(Commit)ํ๋ค๋ฉด ํธ๋์ญ์ ์ด ์ฑ๊ณต์ ์ผ๋ก ์ข ๋ฃ๋๋ค(Committed)
[์์ ์คํจ์]
- ์คํจ(Failed) : ํธ๋์ญ์ ์คํ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ฌ ์ค๋จ๋ ์ํ
- ์ฒ ํ(Aborted) : ํธ๋์ญ์ ์ด ๋น์ ์์ ์ผ๋ก ์ข ๋ฃ๋์ด Rollback ์ฐ์ฐ์ ์ํํ ์ํ
ํธ๋์ญ์ ์ ์ํํ๋ ์ค๊ฐ์ ๋ชจ์ข ์ ์์ธ์ผ๋ก ์ธํด ์ค๋ฅ๊ฐ ๋ฐ์ํ์ฌ ์คํ์ด ์ค๋จ๋๋ฉด ์คํจ (Failed) ์ํ๊ฐ ๋๊ณ , ์ด ๋ ํธ๋์ญ์ ์ด ๋น์ ์์ ์ผ๋ก ์ข ๋ฃ๋์์ผ๋ ์ค๊ณ๋์ด ์๋ ํธ๋์ญ์ ๋ด๋ถ์ ์์ ์ ๋ค์ ์ํ ์ด์ ์ ์ํ๋ก ๋๋ฆฌ๋ ROLLBACK ์ฐ์ฐ์ ์ํํ๋ฉด ์ฒ ํ (Aborted) ์ํ๋ผ ํ๋ค
(4) Commit & Rollback
- Commit
๋ชจ๋ ์์ ๋ค์ ์ ์์ฒ๋ฆฌํ๊ฒ ๋ค๊ณ ํ์ ํ๋ ๋ช ๋ น์ด๋ก์, ํด๋น ์ฒ๋ฆฌ ๊ณผ์ ์ DB์ ์๊ตฌ ์ ์ฅํ๊ฒ ๋ค๋ ์๋ฏธ์ด๋ฉฐ Commit์ ์ํํ๋ฉด ํ๋์ ํธ๋์ญ์ ๊ณผ์ ์ด ์ข ๋ฃ๋๋ ๊ฒ์ด๋ค.
Commit์ ์ํํ๋ฉด ์ด์ ๋ฐ์ดํฐ๊ฐ ์์ ํ ๋ฐ์๋์ด Update ๋๋ค.
- Rollback
Rollback์ ์์ ์ค ๋ฌธ์ ๊ฐ ๋ฐ์๋์ด ํธ๋์ญ์ ์ ์ฒ๋ฆฌ ๊ณผ์ ์์ ๋ฐ์ํ ๋ณ๊ฒฝ์ฌํญ์ ์ทจ์ํ๋ ๋ช ๋ น์ด๋ก์, ํด๋น ๋ช ๋ น์ ํธ๋์ญ์ ์๊ฒ ํ๋ฌํ๋ฉด ํธ๋์ญ์ ์ ์์๋๊ธฐ ์ด์ ์ ์ํ๋ก ๋๋์๊ฐ๋ค.
์ด๊ฒ์ ๋ง์ง๋ง Commit์ ์๋ฃํ ์์ ์ผ๋ก ๋์๊ฐ๋ค๋ ๋ง๊ณผ ์ํตํ๋ค. (์ฆ, Rollback์ Commitํ์ฌ ์ ์ฅํ ์์ ์ํ๋ฅผ ๋ณต๊ตฌํ๋ ๊ฒ)
[์ฐธ๊ณ ] ํธ๋์ญ์ ์์ธ
- ๋ชจ๋ SQL ๋ช ๋ น์ด์ ๋ํด ํธ๋์ญ์ ์ Rollback ๋ช ๋ น์ด ์ ์ฉ๋๋ ๊ฒ์ ์๋๋ค.
- ์๋ฅผ ๋ค์ด, DDL๋ฌธ (CREATE, DROP, ALTER, RENAME, TRUNCATE)์ ํธ๋์ญ์ ์ ๋กค๋ฐฑ ๋์์ด ์๋๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก ํ ์ด๋ธ ๋ด์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋ DML๋ฌธ (SELECT, INSERT, UPDATE, DELETE)์ด ํด๋นํ๋ค.
(5) ํธ๋์ญ์ ๋ฌธ๋ฒ
START TRANSACTION // ํธ๋์ญ์
์์!!!
INSERT INTO emp_table (employee_id, name) VALUES (10, 'TestName');
INSERT INTO emp_table (employee_id, name) VALUES (11, 'TestName');
INSERT INTO emp_table (employee_id, name) VALUES (12, 'TestName');
INSERT INTO emp_table (employee_id, name) VALUES (13, 'TestName');
SAVEPOINT save_point01;
INSERT INTO emp_table (employee_id, name) VALUES (14, 'TestName');
INSERT INTO emp_table (employee_id, name) VALUES (15, 'TestName');
INSERT INTO emp_table (employee_id, name) VALUES (16, 'TestName');
SELECT * FROM emp_table;
INSERT INTO emp_table (employee_id, name) VALUES (17, 'TestName');
INSERT INTO emp_table (employee_id, name) VALUES (18, 'TestName');
ROLLBACK TO save_point01; // save_point01 ๋ก ROLLBACK !!!
SELECT * FROM emp_table;
COMMIT; // ์ต์ข
๋ฐ์
[Reference]
'๐จโ๐ป Back End > MySQL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
DB Lock ๊ธฐ์ด (0) | 2023.07.30 |
---|---|
ํธ๋์ญ์ ๊ฒฉ๋ฆฌ์ฑ ์์ค (0) | 2023.07.25 |
๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ ์ ์ฝ ์กฐ๊ฑด (0) | 2023.07.22 |
Join (์กฐ์ธ) - ๋ด๋ถ ์กฐ์ธ (Inner Join) & ์ธ๋ถ ์กฐ์ธ (Outer Join) (0) | 2023.07.22 |
SubQuery (์๋ธ์ฟผ๋ฆฌ) (0) | 2023.07.22 |