Transaction
[Database] Transaction
์๋ฏธ
์ฌ๋ฌ๊ฐ์ SQL๋ฌธ์ด ํ๋๋ก ๋ฌถ์ฌ์๋ ๊ฒ
๋จ์ผํ ๋ ผ๋ฆฌ์ ์ธ ์์ ๋จ์ (a single logical unit of work)
๋ ผ๋ฆฌ์ ์ธ ์ด์ /๋ชฉ์ ์ผ๋ก ์ฌ๋ฌ SQL๋ฌธ๋ค์ ๋จ์ผ ์์ ์ผ๋ก ๋ฌถ์ด์ ๋๋ ์ง ์ ์๊ฒ ๋ง๋ ๊ฒ
transaction์ SQL๋ฌธ๋ค ์ค์ ์ผ๋ถ๋ง ์ฑ๊ณตํด์ DB์ ๋ฐ์๋๋ ์ผ์ ์์
์ฌ์ฉ
START TRANSACTION;์ผ๋ก ์์COMMIT;์ผ๋ก ์ข ๋ฃ์ง๊ธ๊น์ง ์์ ํ ๋ด์ฉ์ DB์ ์๊ตฌ์ ์ผ๋ก(permanently) ์ ์ฅ
transaction ์ข ๋ฃ
ROLLBACK;์ผ๋ก tansaction ์ด์ ์ํ๋ก ๋์๊ฐ
์์
Transaction : J๋ 100๋ง์์ ๊ฐ๊ณ ์๊ณ , H๋ 200๋ง์์ ๊ฐ๊ณ ์์. J๊ฐ H์๊ฒ 20๋ง์์ ๊ณ์ข์ด์ฒดํจ
START TRANSACTION; UPDATE account SET balance = balance - 200000 WHERE id = 'J'; UPDATE account SET balance = balance + 200000 WHERE id = 'H'; COMMIT;Rollback : J๋ 100๋ง์์ ๊ฐ๊ณ ์๊ณ , H๋ 200๋ง์์ ๊ฐ๊ณ ์์. J๊ฐ H์๊ฒ 30๋ง์์ ๊ณ์ข์ด์ฒดํ๋ ค ํจ. J์์ ์ถ๊ธํ๋๋ฐ H๊ฐ ์ ๊ธ๋ฐ์ง ๋ชปํ๋ ์ํ(์๋ฌ)๊ฐ ๋ฐ์ํจ
START TRANSACTION; UPDATE account SET balance = balance - 300000 WHERE id = 'J'; ROLLBACK;
AUTOCOMMIT
๊ฐ๊ฐ์ SQL๋ฌธ์ ์๋์ผ๋ก transaction์ฒ๋ฆฌ ํด์ฃผ๋ ๊ฐ๋
SQL๋ฌธ์ด ์ฑ๊ณต์ ์ผ๋ก ์คํํ๋ฉด ์๋์ผ๋ก commit ํจ
์คํ ์ค์ ๋ฌธ์ ๊ฐ ์์๋ค๋ฉด ์์์ rollbackํจ
MySQL์์๋ default๋ก autocommit์ด enabled ๋์ด ์์ผ๋ฉฐ, ๋ค๋ฅธ DBMS์์๋ ๋๋ถ๋ถ ๊ฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํจ
autocommit์ ์ค์ ์ ์ธํ ํ์ฌ ์ฌ์ฉํ ์ ์์
SELECT @@AUTOCOMMIT;ํ์ฌ autocommit์ด ์ฌ์ฉ์ค์ธ์ง ํ์ธํ๋ ์ฟผ๋ฆฌ
1์ด ๋ฐํ๋๋ฉด true(ํ์ฑํ), 0์ด ๋ฐํ๋๋ฉด false
SET autocommit=0;์ ํตํด ๋ ์ ์์๋จ,
START TRANSACTION;์ผ๋ก ํธ๋์ ์ ์ ์์ํ๋ฉด,AUTOCOMMIT์ ์ํฅ์ ๋ฐ์ง ์์. COMMIT / ROLLBACK๊ณผ ํจ๊ป transaction์ด ์ข ๋ฃ๋๋ฉด ์๋ autocommit์ํ๋ก ๋์๊ฐ
์ผ๋ฐ์ ์ธ transaction ์ฌ์ฉ ํจํด
transaction์ ์์(begin)ํจ
๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋ ์ฐ๋ ๋ฑ์ SQL๋ฌธ๋ค์ ํฌํจํด์ ๋ก์ง์ ์ํํจ
์ผ๋ จ์ ๊ณผ์ ๋ค์ด ๋ฌธ์ ์์ด ๋์ํ๋ค๋ฉด transaction์ commit ํจ
์ค๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค๋ฉด transaction์ rollbackํจ
java ์ฝ๋ ์์

ACID : ํธ๋์ ์
์ ์์ฑ
Atomicity Consistency Isolation Durability
Atomicity (์์์ฑ)
๋ฌถ์ฌ์๋ ๊ฒ๋ค์ด ๋ชจ๋ ์ฑ๊ณตํ๊ฑฐ๋ ์๋ฌด๊ฒ๋ ์คํ๋์ง ์์ (All or NOTHING)
transaction์ ๋ ผ๋ฆฌ์ ์ผ๋ก ์ชผ๊ฐ์ง ์ ์๋ ์์ ๋จ์์ด๊ธฐ ๋๋ฌธ์ ๋ด๋ถ์ SQL๋ฌธ๋ค์ด ๋ชจ๋ ์ฑ๊ณตํด์ผ ํจ
์ค๊ฐ์ SQL๋ฌธ์ด ์คํจํ๋ฉด ์ง๊ธ๊น์ง์ ์์ ์ ๋ชจ๋ ์ทจ์ํ์ฌ ์๋ฌด ์ผ๋ ์์๋ ๊ฒ์ฒ๋ผ rollbackํจ
commit ์คํ ์ DB์ ์๊ตฌ์ ์ผ๋ก ์ ์ฅํ๊ฑฐ๋ rollback ์คํ ์ ์ด์ ์ํ๋ก ๋๋๋ฆฌ๋ ๊ฒ๋ DBMS๊ฐ ๋ด๋นํจ
๊ฐ๋ฐ์๋ ์ธ์ commit ํ ์ง, ์ธ์ rollbackํ ์ง, transaction ๋จ์๋ฅผ ์ด๋ป๊ฒ ๊ตฌ์ฑํ ์ง ์ ์ ํด์ผ ํจ
Consistency (์ผ๊ด์ฑ)
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ผ๊ด์ฑ์ ์ ์ง์์ผ์ฃผ๋ ๊ฒ
ํธ๋์ญ์ ์ด ํ ์ด๋ธ์ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฉํ ๋ ๋ฏธ๋ฆฌ ์ ์๋, ์์ธกํ ์ ์๋ ๋ฐฉ์๋ง ์ทจํจ (ํ ์ด๋ธ์ ์ด๋ฏธ ์ ํด์ ธ์๋ constraints ๋ฑ์ ๋ํด ์ผ๊ด์ฑ ์๊ฒ ์งํด)
transaction์ DB ์ํ๋ฅผ consistent ์ํ์์ ๋ ๋ค๋ฅธ consistent ์ํ๋ก ๋ฐ๊ฟ
constraints, trigger ๋ฑ์ ํตํด ๋ฏธ๋ฆฌ DB์ ์ ์๋ rules์ transaction์ด ์๋ฐํ๋ค๋ฉด rollbackํจ
transaction์ด DB์ ์ ์๋ rule์ ์๋ฐํ๋์ง๋ DBMS๊ฐ commit ์ ์ ํ์ธํ๊ณ ์๋ ค์ค(error, exception throw ๋ฑ)
๊ทธ ์ธ์ application ๊ด์ ์์ transaction์ด consistentํ๊ฒ ๋์ํ๋์ง๋ ๊ฐ๋ฐ์๊ฐ ์ฑ๊ฒจ์ผ ํจ(DBMS๋ DB์ ์ ์๋ consistence๋ง ์ฑ๊น)
Isolation (๊ฒฉ๋ฆฌ, ๋ถ๋ฆฌ)
ํธ๋์ญ์ ๊ณผ ํธ๋์ญ์ ์ ์๋ก ์ํฅ์ ์ฃผ์ง ์์์ผ ํจ
์ฌ๋ฌ ํธ๋์ญ์ ์ด ๋์์ ์คํ๋๋ฉด ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์์ (race condition ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์์)
์ฌ๋ฌ transaction๋ค์ด ๋์์ ์คํ๋ ๋๋ ํผ์ ์คํ๋๋ ๊ฒ์ฒ๋ผ ๋์ํ๊ฒ ๋ง๋ฆ
๋ชจ๋ ํธ๋์ญ์ ์ด ์๊ฒฉํ๊ฒ ๋๊ธฐ์ ์ผ๋ก ์คํ๋๋ฉด ์ ์ฒด ์๋์ ์ํฅ์ ์ค ์ ์์
๊ทธ๋์ DBMS๋ ์ฌ๋ฌ ์ข ๋ฅ์ isolation level์ ์ ๊ณตํจ (์๊ฒฉํจ์ ์ ๋๊ฐ ๋ค๋ฆ)
๋ ๋ฒจ์ด ๋์ผ๋ฉด ์๊ฒฉ, ๋์์ฑ ๋ฎ์์ง, race conditionํ๋ฅ ๋ฎ์์ง, ํ์ง๋ง ์๋๋ ๋๋ ค์ง
๋ ๋ฒจ์ด ๋ฎ์ผ๋ฉด ๋ ์๊ฒฉ, ๋์์ฑ ๋์์ง, race conditionํ๋ฅ ๋์์ง, ํ์ง๋ง ์๋๋ ๋น๊ต์ ๋น ๋ฆ
์ํฉ์ ๋ฐ๋ผ ์ ์ ํ isolation level์ ์ค์ ํด์ผ ํจ
concurrency control์ ์ฃผ๋ ๋ชฉํ๊ฐ isolation์
Durability (์์กด์ฑ)
commit์ด ๋ ํธ๋์ญ์ ์ DB์ ์๊ตฌ์ ์ผ๋ก ์ ์ฅ๋จ
DB system์ ๋ฌธ์ ๊ฐ(power fail or DB crash ๋ฑ์ผ๋ก ์ธํ DB์๋ฒ ์ฃฝ์) ์๊ฒจ๋ commit๋ transaction์ DB์ ๋จ์์์
์๊ตฌ์ ์ด๋ผ๋ ๋ง์ ์ผ๋ฐ์ ์ผ๋ก๋นํ๋ฐ์ฑ ๋ฉ๋ชจ๋ฆฌ(HDD, SSD)์ ์ ์ฅํจ์ ์๋ฏธํจ๊ธฐ๋ณธ์ ์ผ๋ก ํธ๋์ญ์ ์ durability๋ DBMS๊ฐ ๋ณด์ฅํจ
์ฐธ๊ณ ์ฌํญ
transaction์ ์ด๋ป๊ฒ ์ ์ํด์ ์ธ์ง๋ ๊ฐ๋ฐ์๊ฐ ์ ํจ. ๊ตฌํํ๋ ค๋ ๊ธฐ๋ฅ๊ณผ ACID ์์ฑ์ ์ ์ดํดํด์ผ ํธ๋์ญ์ ์ ์ ์ ์ํ ์ ์์
transaction์ ACID๋ DBMS๊ฐ ์์์ ๋ค ํด์ฃผ๋ ๊ฒ์ ์๋. ๋ํดํธ ์ค์ ๋ผ์๋ ๊ฒ๋ ์์ง๋ง ๊ฐ๋ฐ์๊ฐ ์ ์ฑ๊ฒจ์ผ ํจ
์ฐธ๊ณ
Last updated