Transaction

  • ์ตœ์ข…์ˆ˜์ •: 2024๋…„ 2์›” 14์ผ

Jim Gray (1944-2007)

  • ์„ธ๊ณ„ ์ตœ์ดˆ์˜ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค System-R ๊ฐœ๋ฐœ

  • ํŠธ๋žœ์žญ์…˜ ๊ฐœ๋… ์ œ์•ˆ

  • 2 Phase Locking

  • Granularity Locking

  • ํŠœ๋ง์ƒ๊ณผ ์ฐฐ์Šค๋ฐฐ๋น„์ง€์ƒ ์ˆ˜์ƒ

๋ณต์Šต

  • InnoDB๋Š” ๋ ˆ์ฝ”๋“œ ๊ธฐ๋ฐ˜ ์ €์žฅ๊ตฌ์กฐ
    cf. column store (Amazon Redshift)

  • RID (page #, slot #)๋ฅผ ํ†ตํ•ด ๋ ˆ์ฝ”๋“œ ์ ‘๊ทผ

  • B-tree ๊ธฐ๋ฐ˜ ํด๋Ÿฌ์Šคํ„ฐ๋ง ์ธ๋ฑ์Šค

  • Secondary Index๋Š” PK๋ฅผ ์ฐธ์กฐํ•จ

  • ๋ ˆ์ฝ”๋“œ ๊ธฐ๋ฐ˜ ์ž ๊ธˆ์„ ์ง€์›ํ•˜์ง€๋งŒ ์‹ค์ œ ๋ฌผ๋ฆฌ์  ์ž ๊ธˆ์€ ์ธ๋ฑ์Šค์— ๊ฑธ๋ฆผ

ํŠธ๋žœ์žญ์…˜์˜ ์„ฑ์งˆ

A: Atomicity
C: Consistency
I: Isolation
D: Durability

์ฐธ๊ณ : CAP ์ด๋ก 

C: Consistency
A: Availability
P: Partition Tolerence

์…‹ ๋ชจ๋‘ ๋งŒ์กฑ์‹œํ‚ค๋Š” ์‹œ์Šคํ…œ์€ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†๋‹ค.
(ํŠธ๋žœ์žญ์…˜์˜ ์ผ๊ด€์„ฑ๊ณผ ์˜๋ฏธ๊ฐ€ ๋‹ค์†Œ ๋‹ค๋ฆ„)

๋งŽ์€ NoSQL์€ ์ผ๊ด€์„ฑ์„ ํฌ๊ธฐํ•จ

์ฐธ๊ณ : Eventual Consistency

๋ฏธ๋ž˜์˜ ์–ธ์  ๊ฐ€ ์ผ๊ด€์„ฑ์ด ๋ณด์žฅ๋˜๊ธด ํ•˜๋Š”๋ฐ ๊ทธ ์‹œ์ ์€ ์ •ํ•ด์ง€์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ

S3, DynamoDB๋“ฑ ๋งŽ์€ AWS ์ œํ’ˆ๊ตฐ์ด ์ด๋ฅผ ์ง€์›

์ฐธ๊ณ , NoSQL์˜ ํŠน์„ฑ

BA: Basically Available
S: Soft State
E: Eventual Consistency

์‚ฐ VS ์—ผ๊ธฐ??

ํŠธ๋žœ์žญ์…˜๊ณผ Serial Schedule

  • ๊ฐ€์žฅ ์‰ฝ๊ฒŒ ACID๋ฅผ ์ง€์›ํ•˜๋Š” ๋ฐฉ๋ฒ•์€?

  • ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์”ฉ์˜ ํŠธ๋žœ์žญ์…˜๋งŒ ์‹คํ–‰

Serial Schedule

์„ธ ํŠธ๋žœ์žญ์…˜ A, B, C๊ฐ€ ์žˆ์„ ๋•Œ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์”ฉ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ๊ฐ€๋Šฅํ•œ ๊ฒฐ๊ณผ๋“ค์˜ ์ง‘ํ•ฉ

3!

Serializable

์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํŠธ๋žœ์žญ์…˜ ๊ฒฐ๊ณผ๊ฐ€ Serial Schedule์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์ธ ๊ฒฝ์šฐ Serializable์ด๋ผ๊ณ  ํ•จ

Lock ์—†์ด ํŠธ๋žœ์žญ์…˜์ด ๊ฐ€๋Šฅํ• ๊นŒ?

Transaction์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋“ค

Lost Update Problem

  • ๋‘ ๊ฐœ์˜ ํŠธ๋žœ์žญ์…˜์ด ๋™์‹œ์— ํ•œ ์•„์ดํ…œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ–ˆ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์ 

  • ํŠธ๋žœ์žญ์…˜์„ ์ง€์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ๋Š” ๋ฐœ์ƒํ•˜๋ฉด ์•ˆ ๋จ

(P1) Dirty Read Problem

  • ํ•œ ํŠธ๋žœ์žญ์…˜์—์„œ ๋ณ€๊ฒฝํ•œ ๊ฐ’์„ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ์ฝ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ

(P2) Non-repeatable Read Problem

  • ํ•œ ํŠธ๋žœ์žญ์…˜์—์„œ ๊ฐ™์€ ๊ฐ’์„ ๋‘ ๋ฒˆ ์ฝ์—ˆ์„ ๋•Œ ๊ฐ๊ฐ ๋‹ค๋ฅธ ๊ฐ’์ด ์ฝํžˆ๋Š” ๊ฒฝ์šฐ

(P3) Phantom Read Problem

  • ์ฃผ๋กœ ํ†ต๊ณ„๋‚˜ ๋ถ„์„, aggregation function ๋“ฑ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฟผ๋ฆฌ์—์„œ ์ž˜๋ชป๋œ ๊ฐ’์ด ๋“ค์–ด์˜ค๋Š” ๊ฒฝ์šฐ

Transaction Isolation Level

ANSI SQL (SQL92)

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋งˆ๋‹ค ์ง€์›ํ•˜๋Š” ๋ ˆ๋ฒจ์ด ๋‹ค๋ฆ„

  • MySQL๊ณผ MS-SQL์€ 4๊ฐ€์ง€ ๋ชจ๋‘ ์ง€์›

  • MySQL default: Repeatable Read

Isolation Level ํ™•์ธ ๋ฐ ๋ณ€๊ฒฝ (MySQL 5.7 ์ด์ „)

SHOW VARIABLES LIKE 'tx_isolation';
SET TRANSACTION ISOLATION LEVEL ๋ ˆ๋ฒจ;
START TRANSACTION;
-- QUERY START
COMMIT | ROLLBACK;

๊ฐ€๋Šฅํ•œ ๋ ˆ๋ฒจ

READ UNCOMMITTED
READ COMMITTED
REPEATABLE READ
SERIALIZABLE

Isolation Level ํ™•์ธ ๋ฐ ๋ณ€๊ฒฝ (MySQL 5.7)

https://dev.mysql.com/doc/refman/5.7/en/set-transaction.html

SELECT @@GLOBAL.transaction_isolation, @@transaction_isolation;
SET GLOBAL transaction_isolation='REPEATABLE-READ';
SET SESSION transaction_isolation='SERIALIZABLE';

๊ฐ€๋Šฅํ•œ ๋ ˆ๋ฒจ

READ-UNCOMMITTED
READ-COMMITTED
REPEATABLE-READ
SERIALIZABLE

MVCC

MySQL์˜ InnoDB๋Š” ์˜ค๋ผํด๊ณผ ๊ฐ™์ด MVCC๋ฅผ ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉ

  • ์—…๋ฐ์ดํŠธ ์ค‘์—๋„ ์ฝ๊ธฐ๊ฐ€ ๋ธ”๋ก๋˜์ง€ ์•Š๋Š”๋‹ค.

  • ์ฝ๊ธฐ ๋‚ด์šฉ์€ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค.

  • ์—…๋ฐ์ดํŠธ์‹œ X๋ฝ์ด ์ธ๋ฑ์Šค์— ๊ฑธ๋ฆฐ๋‹ค.

  • ์—…๋ฐ์ดํŠธ์‹œ ๋ฝ์˜ ๋Œ€์ƒ์ด ์‹ค์ œ ์—…๋ฐ์ดํŠธ ์•„์ดํ…œ๋ณด๋‹ค ๋” ํด ์ˆ˜ ์žˆ๋‹ค.

  • ๋™์‹œ ์—…๋ฐ์ดํŠธ๋ฅผ ์ˆ˜ํ–‰์‹œ ๋‚˜์ค‘ ํŠธ๋žœ์žญ์ƒŒ์€ ๋ธ”๋ก๋œ๋‹ค. ์ผ์ • ์‹œ๊ฐ„ ์ง€๋‚˜๋ฉด Lock Timeout์ด ๋ฐœ์ƒํ•œ๋‹ค.

  • ์—…๋ฐ์ดํŠธ์‹œ ์ด์ „ ๊ฐ’์„ Undo Log๋กœ ๋กค๋ฐฑ ์„ธ๊ทธ๋จผํŠธ์— ์œ ์ง€ํ•œ๋‹ค. ์ด ๊ฐ’์€ ๋กค๋ฐฑ์‹œ์™€ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ฐ’์„ ์ฝ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.

Repeatable Read

  • MySQL์˜ ๊ธฐ๋ณธ ๋™์ž‘ ๋ชจ๋“œ

  • ์ฒซ ๋ฒˆ์งธ ์ฝ๊ธฐ์— ์Šค๋ƒ…์ƒท์„ ์ƒ์„ฑํ•จ

  • ์ดํ›„ ๋™์ผ ํŠธ๋žœ์žญ์…˜์—์„œ๋Š” ์Šค๋ƒ…์ƒท์—์„œ๋ถ€ํ„ฐ ๊ฐ’์„ ์ฝ์Œ

  • ์ž ๊ธˆ์˜ ๋Œ€์ƒ์€ unique index, secoendary index์˜ ์œ ๋ฌด์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง

Read Committed

  • ์ปค๋ฐ‹๋œ ์•„์ดํ…œ์„ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“œ

  • ์ปค๋ฐ‹๋˜์ง€ ์•Š์€ ๊ฐ’์€ ์ฝ์„ ์ˆ˜ ์—†๋‹ค.

  • ๊ฐ™์€ ํŠธ๋žœ์žญ์…˜์—์„œ๋Š” ์ตœ๊ทผ์˜ ์Šค๋ƒ…์ƒท์„ ์ฝ๋Š”๋‹ค.

Read Uncommitted

  • ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ๋ฐ”๊พผ ๊ฐ’์ด ํŠธ๋žœ์žญ์…˜ ์ค‘๊ฐ„์—๋„ ๋ฐ˜์˜๋œ๋‹ค.

  • Read Committed์™€๋Š” ๋‹ค๋ฅธ ๊ฐ’์ด ์ฝํž ์ˆ˜ ์žˆ๋‹ค.

  • ์ผ๋ฐ˜์ ์œผ๋กœ ๊ทธ๋ƒฅ ์ตœ์‹  ์—…๋ฐ์ดํŠธ ๊ฐ’์„ ์ฝ๋Š”๋‹ค.

  • ์ƒ๋‹นํžˆ ์œ„ํ—˜ํ•˜๋‹ค!

Serializable

  • MySQL์—์„œ๋Š” ๋ชจ๋“  SELECT๋ฌธ์— S๋ฝ์ด ๊ฑธ๋ฆฐ๋‹ค.

  • Repeatable Read์—์„œ๋„ Phantom ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋งŽ์ด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

  • ์—ญ์‹œ๋‚˜ ๋งค์šฐ ์œ„ํ—˜ํ•˜๋‹ค!

๊ธฐํƒ€

  • MySQL์—์„œ๋Š” ํŠธ๋žœ์žญ์…˜ ๋ ˆ๋ฒจ์— ๋”ฐ๋ผ binlog ํ˜•ํƒœ๊ฐ€ ๋ฐ”๋€๋‹ค.

  • ์ด์ „ ๋ฒ„์ „์—์„œ๋Š” row ๋ ˆ๋ฒจ์ด ์šฉ๋Ÿ‰๊ณผ ์„ฑ๋Šฅ๋ฌธ์ œ๊ฐ€ ์žˆ์–ด์„œ ์ฃผ๋กœ mixed๋‚˜ statement๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ 5.7๋ถ€ํ„ฐ row ๋ ˆ๋ฒจ์— ๋งŽ์€ ๊ฐœ์„ ์ด ์žˆ์—ˆ๋‹ค๊ณ  ํ•จ

๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ์˜ ํŠธ๋žœ์žญ์…˜

2 PC (2 Phase Commit)

  • ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ ํŠธ๋žœ์žญ์…˜์˜ ๋กค๋ฐฑ๊ณผ ์ปค๋ฐ‹์„ ๊ฒฐ์ •ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํ”„๋กœํ† ์ฝœ

  • ์˜ค๋ผํด ๋“ฑ์—์„œ ์ง€์›

MySQL์™€ 2PC

  • MySQL 5.7 ๋ถ€ํ„ฐ XA ํŠธ๋žœ์žญ์…˜์„ ์ง€์›ํ•จ

  • ์ถ”์ฒœํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค๊ณ  ํ•จ

๋” ๊ณต๋ถ€ํ•˜๊ธฐ

  • ๋‚™๊ด€์  ์ž ๊ธˆ๊ณผ ๋น„๊ด€์  ์ž ๊ธˆ์˜ ๋™์ž‘ ์›๋ฆฌ

  • CRDT ๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

  • ๋ถ„์‚ฐ ํŠธ๋žœ์žญ์…˜

  • ์Šคํ”„๋ง๊ณผ ๋‚™๊ด€์  ์ž ๊ธˆ

  • WAL ํ”„๋กœํ† ์ฝœ

  • ์–ธ๋‘ ๋กœ๊ทธ, ๋ฆฌ๋‘ ๋กœ๊ทธ, ์ฒดํฌํฌ์ธํŠธ

๊ธฐํƒ€ ์ดˆ๋ณด ํŒ

  • autocommit์„ ๋„์ž (ํŠนํžˆ JDBC ๋“ฑ์—์„œ ์ฃผ์˜)

  • ๊ธด ํŠธ๋žœ์žญ์…˜์€ ๋ฐ๋“œ๋ฝ์˜ ์›์ธ

  • ๋ฐฐ์น˜ ์ž‘์—… ์ค‘๊ฐ„์— ์ปค๋ฐ‹์„ ํ•˜์ž

  • ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š์€ ํŠธ๋žœ์žญ์…˜ ๋ฐ ์ปค๋„ฅ์…˜์˜ ์ฃผ์˜!

  • ํŠธ๋žœ์žญ์…˜ ์ค‘๊ฐ„์— ์‚ฌ์šฉ์ž ์ž…๋ ฅ์ด ์กด์žฌํ•˜๋ฉด ์•ˆ๋จ!

  • ์„œ๋ฒ„ ๋ชจ๋‹ˆํ„ฐ๋ง์€ ์ฃผ๊ธฐ์ ์œผ๋กœ