Database/SQL

SERIALIZABLE์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๋ฐ๋“œ๋ฝ์ด ๋ฐœ์ƒํ•˜๋Š” ์ด์œ ๊ฐ€ ๋ญ˜๊นŒ?

์ฑ”๐Ÿป 2024. 2. 9. 20:37

์•„๋ž˜๋Š” ์ €์˜ ์‚ฝ์งˆ ๊ณผ์ •์ด ์ ํ˜€์ ธ์žˆ์œผ๋‹ˆ ๊ฒฐ๋ก ์ด ๊ถ๊ธˆํ•˜์‹  ๋ถ„๋“ค์€ ์œ„ ๋ชฉ์ฐจ์—์„œ โ€˜๊ฒฐ๋ก โ€™์œผ๋กœ ๊ฐ€์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ‘€์˜๋ฌธ์ 

์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด Isolation Level Serializable์„ ์ ์šฉํ•˜๊ณ  ์žฌ๊ณ  499๊ฐœ ์ƒํƒœ์—์„œ 100๊ฐœ์˜ ์“ฐ๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ผํ•œ 5๊ฐœ ์ƒํ’ˆ์— ๋Œ€ํ•œ ์ด 500๊ฐœ์˜ ์ฃผ๋ฌธ์„ ์‹œ๋„๋ฅผ ํ•ด๋ณด๋ ค๊ณ  ํ–ˆ์œผ๋‚˜ ๋ฐ๋“œ๋ฝ์ด ๋ฐœ์ƒํ•˜์˜€๋‹ค.

๋‚˜๋Š” Serializable์˜ ๋‹จ์ ์œผ๋กœ ๋ชจ๋“  ๊ฑธ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์†๋„๊ฐ€ ๋А๋ฆฌ๋‹ค๋Š” ๊ฒƒ ๋ง๊ณ ๋Š” ๋ชฐ๋ž์—ˆ๋Š”๋ฐ.. ์ด ํ…Œ์ŠคํŠธ๋กœ Serializable ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์—์„œ ๋ฐ๋“œ๋ฝ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฑธ ์ฒ˜์Œ ์•Œ์•˜๋‹ค.

๋‚ด๊ฐ€ ์ƒ๊ฐํ•œ serializable ๋ฐ๋“œ๋ฝ ์‹œ๋‚˜๋ฆฌ์˜ค

์•„๋ž˜๊ฐ€ ์ผ๋ฐ˜์ ์ธ ๋ฐ๋“œ๋ฝ์ด ๋ฐœ์ƒํ•˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๋ผ๋Š”๋ฐ ์™œ ๋ฐ๋“œ๋ฝ์ด ๋ฐœ์ƒํ•˜๋Š”์ง€ ์ „ํ˜€ ์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š์•˜๋‹ค.

ํŠธ๋žœ์žญ์…˜ AํŠธ๋žœ์žญ์…˜ B
1select ~ where id = 1 for share;
2select ~ where id = 1 for share;
3update ~ where id = 1
4update ~ where id = 1;
5DEAD LOCKDEAD LOCK
6ROLL BACK
7๋ฐฐํƒ€ ๋ฝ ํš๋“ ํ›„ ์—…๋ฐ์ดํŠธ ์ฟผ๋ฆฌ ์‹คํ–‰
8COMMIT
[ ๋ฐฐํƒ€๋ฝ ๋ฐ˜ํ™˜ ]

๋‚˜๋Š” ํŠธ๋žœ์žญ์…˜ B๊ฐ€ 2๋ฒˆ์—์„œ ์กฐํšŒ๊ฐ€ ๋๋‚˜๊ณ  S-Lock์„ ๋ฐ˜๋‚ฉํ•˜๋ฉด, ํŠธ๋žœ์žญ์…˜ A๊ฐ€ X-Lock์„ ์–ป์–ด์„œ update๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์„ ์ค„ ์•Œ์•˜๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์™œ ๋ฐ๋“œ๋ฝ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฑด์ง€๊ฐ€ ์˜๋ฌธ์ด์—ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  S-Lock(๊ณต์œ  ๋ฝ)์„ ๋ณด์œ ํ•œ ํŠธ๋žœ์žญ์…˜์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด X-Lock(๋ฐฐํƒ€ ๋ฝ)์œผ๋กœ ์ „ํ™˜ํ•˜๋ ค๋ฉด, ๊ธฐ์กด์˜ ๋ชจ๋“  S-Lock์ด ํ•ด์ œ๋œ ์ƒํƒœ์—ฌ์•ผ ํ•œ๋‹ค๊ณ  ์•Œ๊ณ  ์žˆ๋‹ค. ๋‚˜๋Š” S-Lock์ด ํŠธ๋žœ์žญ์…˜์ด ์ข…๋ฃŒ๋˜์ง€ ์•Š์•„๋„ ์กฐํšŒ๊ฐ€ ๋๋‚˜๋ฉด Lock์ด ์ž๋™์œผ๋กœ ๋ฐ˜ํ™˜๋œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—(์ž˜๋ชป๋œ ์ง€์‹ ใ…Žใ…Ž,,,,), ํŠธ๋žœ์žญ์…˜B์˜ 2๋ฒˆ ์กฐํšŒ ์™„๋ฃŒ ํ›„ S-Lock์ด ํ•ด์ œ๋˜๊ณ , ์ดํ›„ ํŠธ๋žœ์žญ์…˜A๊ฐ€ X-Lock์„ ํš๋“ํ•˜์—ฌ ์—…๋ฐ์ดํŠธ๋ฅผ ์›ํ™œํ•˜๊ฒŒ ์ง„ํ–‰ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ–ˆ๋‹ค.

  • ๋ฐ๋“œ๋ฝ MySQL ๋กœ๊ทธ
    =====================================
    2024-02-04 10:56:13 0x179f3b000 INNODB MONITOR OUTPUT
    =====================================
    Per second averages calculated from the last 4 seconds
    -----------------
    BACKGROUND THREAD
    -----------------
    srv_master_thread loops: 380 srv_active, 0 srv_shutdown, 213480 srv_idle
    srv_master_thread log flush and writes: 0
    ----------
    SEMAPHORES
    ----------
    OS WAIT ARRAY INFO: reservation count 7025
    OS WAIT ARRAY INFO: signal count 6733
    RW-shared spins 0, rounds 0, OS waits 0
    RW-excl spins 0, rounds 0, OS waits 0
    RW-sx spins 0, rounds 0, OS waits 0
    Spin rounds per wait: 0.00 RW-shared, 0.00 RW-excl, 0.00 RW-sx
    ------------------------
    LATEST DETECTED DEADLOCK
    ------------------------
    2024-02-04 10:56:11 0x178a5f000
    *** (1) TRANSACTION:
    TRANSACTION 801177, ACTIVE 0 sec starting index read
    mysql tables in use 1, locked 1
    LOCK WAIT 4 lock struct(s), heap size 1128, 2 row lock(s)
    MySQL thread id 13761, OS thread handle 6338752512, query id 556491 localhost 127.0.0.1 root updating
    UPDATE prod_opt
            SET INV_QTY = INV_QTY - 1
            WHERE OPT_COMB_NO = 1
    
    *** (1) HOLDS THE LOCK(S):
    RECORD LOCKS space id 214 page no 9 n bits 408 index PRIMARY of table `syusyu`.`prod_opt` trx id 801177 lock mode S locks rec but not gap
    Record lock, heap no 2 PHYSICAL RECORD: n_fields 13; compact format; info bits 0
     0: len 4; hex 80000001; asc     ;;
     1: len 6; hex 0000000c3997; asc     9 ;;
     2: len 7; hex 02000001a02cbc; asc      , ;;
     3: len 4; hex 80002711; asc   ' ;;
     4: len 4; hex 80000000; asc     ;;
     5: len 4; hex 8000000a; asc     ;;
     6: len 4; hex 649d3e1a; asc d > ;;
     7: len 4; hex 80013880; asc   8 ;;
     8: SQL NULL;
     9: SQL NULL;
     10: SQL NULL;
     11: SQL NULL;
     12: len 1; hex 4e; asc N;;
    
    
    *** (1) WAITING FOR THIS LOCK TO BE GRANTED:
    RECORD LOCKS space id 214 page no 9 n bits 408 index PRIMARY of table `syusyu`.`prod_opt` trx id 801177 lock_mode X locks rec but not gap waiting
    Record lock, heap no 2 PHYSICAL RECORD: n_fields 13; compact format; info bits 0
     0: len 4; hex 80000001; asc     ;;
     1: len 6; hex 0000000c3997; asc     9 ;;
     2: len 7; hex 02000001a02cbc; asc      , ;;
     3: len 4; hex 80002711; asc   ' ;;
     4: len 4; hex 80000000; asc     ;;
     5: len 4; hex 8000000a; asc     ;;
     6: len 4; hex 649d3e1a; asc d > ;;
     7: len 4; hex 80013880; asc   8 ;;
     8: SQL NULL;
     9: SQL NULL;
     10: SQL NULL;
     11: SQL NULL;
     12: len 1; hex 4e; asc N;;
    
    
    *** (2) TRANSACTION:
    TRANSACTION 801178, ACTIVE 0 sec starting index read
    mysql tables in use 1, locked 1
    LOCK WAIT 4 lock struct(s), heap size 1128, 2 row lock(s)
    MySQL thread id 13762, OS thread handle 6344323072, query id 556490 localhost 127.0.0.1 root updating
    UPDATE prod_opt
            SET INV_QTY = INV_QTY - 1
            WHERE OPT_COMB_NO = 1
    
    *** (2) HOLDS THE LOCK(S):
    RECORD LOCKS space id 214 page no 9 n bits 408 index PRIMARY of table `syusyu`.`prod_opt` trx id 801178 lock mode S locks rec but not gap
    Record lock, heap no 2 PHYSICAL RECORD: n_fields 13; compact format; info bits 0
     0: len 4; hex 80000001; asc     ;;
     1: len 6; hex 0000000c3997; asc     9 ;;
     2: len 7; hex 02000001a02cbc; asc      , ;;
     3: len 4; hex 80002711; asc   ' ;;
     4: len 4; hex 80000000; asc     ;;
     5: len 4; hex 8000000a; asc     ;;
     6: len 4; hex 649d3e1a; asc d > ;;
     7: len 4; hex 80013880; asc   8 ;;
     8: SQL NULL;
     9: SQL NULL;
     10: SQL NULL;
     11: SQL NULL;
     12: len 1; hex 4e; asc N;;
    
    
    *** (2) WAITING FOR THIS LOCK TO BE GRANTED:
    RECORD LOCKS space id 214 page no 9 n bits 408 index PRIMARY of table `syusyu`.`prod_opt` trx id 801178 lock_mode X locks rec but not gap waiting
    Record lock, heap no 2 PHYSICAL RECORD: n_fields 13; compact format; info bits 0
     0: len 4; hex 80000001; asc     ;;
     1: len 6; hex 0000000c3997; asc     9 ;;
     2: len 7; hex 02000001a02cbc; asc      , ;;
     3: len 4; hex 80002711; asc   ' ;;
     4: len 4; hex 80000000; asc     ;;
     5: len 4; hex 8000000a; asc     ;;
     6: len 4; hex 649d3e1a; asc d > ;;
     7: len 4; hex 80013880; asc   8 ;;
     8: SQL NULL;
     9: SQL NULL;
     10: SQL NULL;
     11: SQL NULL;
     12: len 1; hex 4e; asc N;;
    
    *** WE ROLL BACK TRANSACTION (2)
    ------------
    TRANSACTIONS
    ------------
    Trx id counter 801188
    Purge done for trx's n:o < 801188 undo n:o < 0 state: running but idle
    History list length 12
    LIST OF TRANSACTIONS FOR EACH SESSION:
    ---TRANSACTION 281480386120832, not started
    0 lock struct(s), heap size 1128, 0 row lock(s)
    ---TRANSACTION 281480386120040, not started
    0 lock struct(s), heap size 1128, 0 row lock(s)
    ---TRANSACTION 281480386119248, not started
    0 lock struct(s), heap size 1128, 0 row lock(s)
    --------
    FILE I/O
    --------
    I/O thread 0 state: waiting for i/o request ((null))
    I/O thread 1 state: waiting for i/o request (insert buffer thread)
    I/O thread 2 state: waiting for i/o request (read thread)
    I/O thread 3 state: waiting for i/o request (read thread)
    I/O thread 4 state: waiting for i/o request (read thread)
    I/O thread 5 state: waiting for i/o request (read thread)
    I/O thread 6 state: waiting for i/o request (write thread)
    I/O thread 7 state: waiting for i/o request (write thread)
    I/O thread 8 state: waiting for i/o request (write thread)
    Pending normal aio reads: [0, 0, 0, 0] , aio writes: [0, 0, 0, 0] ,
     ibuf aio reads:
    Pending flushes (fsync) log: 0; buffer pool: 0
    1181 OS file reads, 137311 OS file writes, 89120 OS fsyncs
    0.00 reads/s, 0 avg bytes/read, 20.93 writes/s, 15.42 fsyncs/s
    -------------------------------------
    INSERT BUFFER AND ADAPTIVE HASH INDEX
    -------------------------------------
    Ibuf: size 1, free list len 0, seg size 2, 0 merges
    merged operations:
     insert 0, delete mark 0, delete 0
    discarded operations:
     insert 0, delete mark 0, delete 0
    Hash table size 34679, node heap has 2 buffer(s)
    Hash table size 34679, node heap has 1 buffer(s)
    Hash table size 34679, node heap has 1 buffer(s)
    Hash table size 34679, node heap has 4 buffer(s)
    Hash table size 34679, node heap has 2 buffer(s)
    Hash table size 34679, node heap has 2 buffer(s)
    Hash table size 34679, node heap has 1 buffer(s)
    Hash table size 34679, node heap has 1 buffer(s)
    38.24 hash searches/s, 11.50 non-hash searches/s
    ---
    LOG
    ---
    Log sequence number          907910858
    Log buffer assigned up to    907910858
    Log buffer completed up to   907910858
    Log written up to            907910858
    Log flushed up to            907910858
    Added dirty pages up to      907910858
    Pages flushed up to          907899930
    Last checkpoint at           907899930
    Log minimum file id is       268
    Log maximum file id is       277
    98399 log i/o's done, 12.25 log i/o's/second
    ----------------------
    BUFFER POOL AND MEMORY
    ----------------------
    Total large memory allocated 0
    Dictionary memory allocated 851227
    Buffer pool size   8191
    Free buffers       6027
    Database pages     2150
    Old database pages 773
    Modified db pages  21
    Pending reads      0
    Pending writes: LRU 0, flush list 0, single page 0
    Pages made young 2, not young 0
    0.00 youngs/s, 0.00 non-youngs/s
    Pages read 1133, created 1017, written 30485
    0.00 reads/s, 0.22 creates/s, 7.93 writes/s
    Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not 0 / 1000
    Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
    LRU len: 2150, unzip_LRU len: 0
    I/O sum[0]:cur[0], unzip sum[0]:cur[0]
    --------------
    ROW OPERATIONS
    --------------
    0 queries inside InnoDB, 0 queries in queue
    0 read views open inside InnoDB
    Process ID=2301, Main thread ID=0x178c8f000 , state=sleeping
    Number of rows inserted 81505, updated 13637, deleted 0, read 122549
    7.50 inserts/s, 1.50 updates/s, 0.00 deletes/s, 12.00 reads/s
    Number of system rows inserted 39, updated 374, deleted 16, read 68564
    0.00 inserts/s, 0.00 updates/s, 0.00 deletes/s, 0.00 reads/s
    ----------------------------
    END OF INNODB MONITOR OUTPUT
    ============================

โ“ ์›์ธ ์ถ”๋ก  & ํ•ด๊ฒฐ์ฑ… ์‹œ๋„

  1. ๋ฐ๋“œ๋ฝ์ด ๋Œ€์ฒด ์™œ ๋ฐœ์ƒํ•˜๋Š” ๊ฑด์ง€ ์•Œ๊ณ  ์‹ถ์–ด์„œ ๋กœ๊ทธ๋ฅผ ์‚ดํŽด๋ณด์•˜๋‹ค. ํ•˜์ง€๋งŒ ๋กœ๊ทธ๋ฅผ ๋ด๋„ ์ดํ•ด๊ฐ€ ๋ ๋ฆฌ๊ฐ€ ์—†์—ˆ๋‹ค.. ์™œ๋ƒ..? ์• ์ดˆ์— ๋ฝ ๊ฐœ๋…์„ ์ž˜๋ชป ์•Œ๊ณ ์žˆ์—ˆ์œผ๋‹ˆ๊นŒ..
  1. ํŠธ๋žœ์žญ์…˜ ๊ฐ„์˜ lock ๋ฐ˜ํ™˜ ๋ฐ ํš๋“ ๊ณผ์ •์— ๋Œ€ํ•œ ์ž˜๋ชป ์•Œ๊ณ  ์žˆ์—ˆ๋˜ ๊ฒŒ ์›์ธ์ด์—ˆ๋‹ค.

    ์•Œ๊ณ ๋ณด๋‹ˆ.. ๋‚˜๋Š” ์กฐํšŒ๋ฅผ ํ•  ๋•Œ S-Lock์„ ๊ฑธ์—ˆ์œผ๋ฉด ํŠธ๋žœ์žญ์…˜์ด ์ข…๋ฃŒ๋˜์ง€ ์•Š์•„๋„ ๊ทธ ๋ฌธ์žฅ์˜ ์‹คํ–‰์ด ๋๋‚˜๋ฉด ๋ฝ์ด ๋ฐ˜ํ™˜๋˜๋Š” ์ค„ ์•Œ์•˜๋‹ค. ํ•˜์ง€๋งŒ S-Lock์ด์–ด๋„ ๊ทธ Lock์€ ํŠธ๋žœ์žญ์…˜ ๋‹จ์œ„๋กœ ๊ด€๋ฆฌ๋˜๊ณ , ํŠธ๋žœ์žญ์…˜์ด ์ข…๋ฃŒ๋˜์–ด์•ผ Lock์ด ๋ฐ˜ํ™˜๋œ๋‹ค๊ณ  ํ•œ๋‹ค.

๐Ÿ’กS-Lock์ด๋‚˜ X-Lock์€ ํš๋“ ์‹œ ํŠธ๋žœ์žญ์…˜์ด ์ปค๋ฐ‹๋˜๊ฑฐ๋‚˜ ๋กค๋ฐฑ๋  ๋•Œ๊นŒ์ง€ ์œ ์ง€๋œ๋‹ค.

โ‡’ ํŠธ๋žœ์žญ์…˜ ๋‹จ์œ„๋กœ ๋ฝ์ด ๊ด€๋ฆฌ๋จ.

โœ”๊ฒฐ๋ก (Serializable์—์„œ ๋ฐ๋“œ๋ฝ์ด ๋ฐœ์ƒํ•˜๋Š” ์ด์œ )

๊ต์ฐฉ์ƒํƒœ(Deadlock, ๋ฐ๋“œ๋ฝ)์ด๋ž€?

๋ฐ๋“œ๋ฝ์€ ๋‘ ์„ธ์…˜์ด ์„œ๋กœ ์ ‘๊ทผํ•˜๋ ค๋Š” ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด ์ž ๊ธˆ์„ ์„ค์ •ํ•˜๊ณ , ์–‘์ธก ๋ชจ๋‘ ์ƒ๋Œ€๋ฐฉ์˜ ์ž ๊ธˆ์ด ํ•ด์ œ๋  ๋•Œ๊นŒ์ง€ ์ง„ํ–‰์„ ๋ฉˆ์ถ˜ ์ƒํƒœ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ด ์ƒํ™ฉ์€ ์–ด๋А ํ•œ ์ชฝ์ด ๋ฌผ๋Ÿฌ๋‚˜์ง€ ์•Š๋Š” ์ด์ƒ ํ•ด๊ฒฐ๋  ์ˆ˜ ์—†์œผ๋ฉฐ, ์ข์€ ๊ณจ๋ชฉ์—์„œ ๋งˆ์ฃผ์นœ ๋‘ ๋Œ€์˜ ์ฐจ๋Ÿ‰์ด ์„œ๋กœ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์—†๋Š” ์ƒํƒœ์— ๋น„์œ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ต์ฐฉ์ƒํƒœ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด, ์ด๋ฅผ ๋จผ์ € ์ธ์ง€ํ•œ ์„ธ์…˜์€ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚จ ํŠน์ • ๋ช…๋ น๋ฌธ์— ๋Œ€ํ•ด ๋กค๋ฐฑ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค. ํ•œ ์„ธ์…˜์˜ ์ž ๊ธˆ์ด ํ•ด์ œ๋˜๋ฉด, ์ด๋กœ ์ธํ•ด ๋‚˜๋จธ์ง€ ์„ธ์…˜๋„ ์›ํ™œํ•˜๊ฒŒ ์ง„ํ–‰๋  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋œ๋‹ค.

S-Lock๊ณผ X-Lock

  1. ๊ณต์œ ๋ฝ(Shared Lock / ์ฝ๊ธฐ ๋ฝ / S-Lock)
    • ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์ด ๋™์‹œ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ๋ฝ
    • ํŠธ๋žœ์žญ์…˜์ด ๊ฐ์ฒด๋ฅผ ์ฝ๊ธฐ ์›ํ•œ๋‹ค๋ฉด ๋จผ์ € ๋…์  ๋ชจ๋“œ๋กœ ์ž ๊ธˆ์„ ํš๋“ํ•ด์•ผ ํ•œ๋‹ค. ๋™์‹œ์— ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์ด ๊ณต์œ  ๋ชจ๋“œ๋กœ ์ž ๊ธˆ์„ ํš๋“ํ•˜๋Š” ๊ฒƒ์€ ํ—ˆ์šฉ๋˜์ง€๋งŒ ๋งŒ์•ฝ ๊ทธ ๊ฐ์ฒด์— ์ด๋ฏธ ๋…์  ๋ชจ๋“œ๋กœ ์ž ๊ธˆ์„ ํš๋“ํ•œ ํŠธ๋žœ์žญ์…˜์ด ์žˆ์œผ๋ฉด ์ด ํŠธ๋žœ์žญ์…˜์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•œ๋‹ค.
  1. ๋ฐฐํƒ€๋ฝ(Exclusive Lock / ์“ฐ๊ธฐ ๋ฝ / X-Lock)
    • ๋ฐฐํƒ€๋ฝ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๋ฝ์œผ๋กœ, ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜๋งŒ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.
    • ํŠธ๋žœ์žญ์…˜์ด ๊ฐ์ฒด์— ์“ฐ๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๋ฉด ๋จผ์ € ๋…์  ๋ชจ๋“œ๋กœ ์ž ๊ธˆ์„ ํš๋“ํ•ด์•ผ ํ•œ๋‹ค. ๋‹ค๋ฅธ ์–ด๋–ค ํŠธ๋žœ์žญ์…˜๋„ ๋™์‹œ์— ์ž ๊ธˆ์„ ํš๋“ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ(๊ณต์œ  ๋ชจ๋“œ๋“ ์ง€ ๋…์  ๋ชจ๋“œ๋“ ์ง€) ๊ทธ ๊ฐ์ฒด์— ์ž ๊ธˆ์ด ์กด์žฌํ•œ๋‹ค๋ฉด ํŠธ๋žœ์žญ์…˜์€ ๋Œ€๊ธฐํ•ด์•ผ ํ•œ๋‹ค.

Serializable ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์—์„œ์˜ ๋ฐ๋“œ๋ฝ ๋ฐœ์ƒ ์‹œ๋‚˜๋ฆฌ์˜ค

ํŠธ๋žœ์žญ์…˜ AํŠธ๋žœ์žญ์…˜ B์„ค๋ช…
1select ~ where id = 1 for share;ํŠธ๋žœ์žญ์…˜ A๊ฐ€ id = 1 row์— ๋Œ€ํ•œ S-Lock ํš๋“
2select ~ where id = 1 for share;ํŠธ๋žœ์žญ์…˜ B๊ฐ€ id = 1 row์— ๋Œ€ํ•œ S-Lock ํš๋“
3update ~ where id = 1ํŠธ๋žœ์žญ์…˜ A๊ฐ€ ์—…๋ฐ์ดํŠธ๋ฅผ ์œ„ํ•ด X-Lock์„ ์š”์ฒญํ•˜์ง€๋งŒ, ํŠธ๋žœ์žญ์…˜ B๊ฐ€ S-Lock์„ ๋ณด์œ  ์ค‘์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฝ์„ ๋ฐ˜ํ™˜ํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.
4update ~ where id = 1;ํŠธ๋žœ์žญ์…˜ B๋„ ์—…๋ฐ์ดํŠธ๋ฅผ ์œ„ํ•ด X-Lock์„ ์š”์ฒญํ•˜์ง€๋งŒ, ํŠธ๋žœ์žญ์…˜ A๊ฐ€ S-Lock์„ ๋ณด์œ  ์ค‘์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฝ์„ ๋ฐ˜ํ™˜ํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.
5DEAD LOCKDEAD LOCK์ด์ œ ๋‘ ํŠธ๋žœ์žญ์…˜ ๋ชจ๋‘ ์„œ๋กœ S-Lock์„ ๋ฐ˜ํ™˜ํ•  ๋•Œ๊นŒ์ง€ ๊ณ„์† ๋Œ€๊ธฐํ•˜๊ฒŒ๋œ๋‹ค โ†’ ๋ฐ๋“œ๋ฝ
6ROLL BACKDBMS๊ฐ€ ๋ฐ๋“œ๋ฝ์„ ๊ฐ์ง€ํ•˜๊ณ  ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํŠธ๋žœ์žญ์…˜ B๋ฅผ ๊ฐ•์ œ๋กœ ๋กค๋ฐฑ์‹œํ‚จ๋‹ค. ์ด๋•Œ S-Lock์ด ๋ฐ˜ํ™˜๋œ๋‹ค.
7[ acquires a exclusive lock
โ†’ execute update query ]
ํŠธ๋žœ์žญ์…˜ B๊ฐ€ ๋กค๋ฐฑ๋˜์–ด X-Lock์„ ์–ป์„ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค. ํŠธ๋žœ์žญ์…˜ A๋Š” ๋ฝ์„ ์–ป์–ด ์—…๋ฐ์ดํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.
8COMMIT
[ release exclusive lock ]
์ž‘์—…์ด ์™„๋ฃŒ๋˜๊ณ  ์ปค๋ฐ‹ํ•œ๋‹ค.
ํŠธ๋žœ์žญ์…˜ A๊ฐ€ ๋ณด์œ ํ•˜๊ณ  ์žˆ๋˜
X-Lock์ด ํ•ด์ œ๋œ๋‹ค.

๐Ÿ”œ ๋‚˜๊ฐ€๋ฉฐ

์ง์ ‘ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด Serializable ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด ์™œ ๋™์‹œ์„ฑ ์ธก๋ฉด์—์„œ ์ตœ์•…์ธ์ง€ ๋ฐ”๋กœ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋ฐ๋“œ๋ฝ์ด ๋ฐœ์ƒํ•˜๊ณ  ํŠธ๋žœ์žญ์…˜์ด ๊ณ„์† ๋กค๋ฐฑ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ์ด ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์—์„œ๋Š” ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์ž‘์—…๋งŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ณ  ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฑธ ์ง์ ‘ ๊ฒฝํ—˜ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

๋ฐ๋“œ๋ฝ์— ๋Œ€ํ•œ ์‚ฌ์ „์ •์˜๋Š” ์•Œ๊ณ  ์žˆ์—ˆ์ง€๋งŒ, ์‹ค์ œ๋กœ ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ์ด ๊ฐœ๋…์„ ์„ค๋ช…ํ•ด์•ผ ํ•  ๋•Œ ๋ช…ํ™•ํ•˜๊ฒŒ ์„ค๋ช…ํ•˜์ง€ ๋ชปํ–ˆ์—ˆ๋‹ค. ์‹ค์ œ๋กœ ๊ฒช์–ด๋ณธ์ ๋„ ์—†๊ณ  ์ด๋ก ์œผ๋กœ๋งŒ ๋Œ€์ถฉ ์•Œ๊ณ  ์žˆ์—ˆ์œผ๋‹ˆ ๋‹น์—ฐํ–ˆ๋‹ค ์ด๋ฒˆ ๊ฒฝํ—˜์„ ํ†ตํ•ด ์—ญ์‹œ ์ง์ ‘ ๊ฒช์–ด๋ณด๋Š” ๊ฒŒ ์ด๋ก ์ ์œผ๋กœ๋งŒ ๋ฐฐ์šด ์ง€์‹์˜ ์ดํ•ด๋„๊ฐ€ ๊นŠ์–ด์ง€๊ณ , ๊ธฐ์–ต์—๋„ ๋” ์˜ค๋ž˜ ๋‚จ๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์ƒˆ์‚ผ ๋˜ ๊นจ๋‹ฌ์•˜๋‹ค.

์™œ ๋งŽ์€ ์„ ๋ฐฐ ๊ฐœ๋ฐœ์ž๋“ค์ด ์—๋Ÿฌ๋ฅผ ๋งŽ์ด ๋‚ด๋ณด๋ผ๊ณ ํ•˜๋Š” ์กฐ์–ธ์„ ๋งŽ์ด ํ•ด์ฃผ์‹œ๋Š”์ง€ ์ด๋ฒˆ ๊ฒฝํ—˜์„ ํ†ตํ•ด ๋ผˆ์ €๋ฆฌ๊ฒŒ ๋А๊ผˆ๋‹ค. ์—๋Ÿฌ๋ฅผ ๋งŽ์ด ๋‚ด๋ณธ ์‚ฌ๋žŒ์ด ์™œ ํญ๋ฐœ์ ์ธ ์„ฑ์žฅ์„ํ•˜๋Š”์ง€๋„ ์•Œ ๊ฒƒ ๊ฐ™๋‹ค. ์ด์ „์˜ ๋‚˜๋Š” ์˜ค๋ฅ˜๋ฅผ ํ”ผํ•˜๋ ค๊ณ ๋งŒ ํ•˜๊ณ , ๋น ๋ฅธ ํ•ด๊ฒฐ ํ•˜๋ ค๊ณ  ํšจ์œจ์„ฑ๋งŒ์„ ์ถ”๊ตฌํ–ˆ์—ˆ๋‹ค. ๋™๋ฃŒ๋“ค์ด ๊ฒช๋Š” ๊ธฐ์ƒ์ฒœ์™ธํ•œ ์˜ค๋ฅ˜๋“ค์„ ๋ณด๋ฉฐ ์–ด๋–ป๊ฒŒํ•˜๋ฉด ์ €๋Ÿฐ ์—๋Ÿฌ๊ฐ€ ๋‚  ์ˆ˜ ์žˆ๋Š”๊ฑฐ์ง€..? ์‹ถ์€ ์ƒํ™ฉ์ด ๋งŽ์•˜์—ˆ๋‹ค ใ…‹ใ…‹ใ…‹ ์—๋Ÿฌ๋ฅผ ๋งˆ์ฃผํ•˜๊ณ , ๊ทธ ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ• ์ง€ ๊ณ ๋ฏผํ•˜๊ณ  ์ ‘๊ทผํ•˜๋Š” ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ๋‚˜๋งŒ์˜ ๋ฌธ์ œ ํ•ด๊ฒฐ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ •๋ฆฝํ•˜๋Š”๋ฐ ๋งŽ์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฐ ๊ฒฝํ—˜๋“ค์ด ์Œ“์ด๋ฉด์„œ ์•ž์œผ๋กœ ๋” ์–ด๋ ค์šด ๋ฌธ์ œ๋ฅผ ๋งŒ๋‚˜๊ฒŒ ๋˜์—ˆ์„ ๋•Œ ๋‘๋ ค์›Œํ•˜์ง€ ์•Š๊ณ  ์ฆ๊ธฐ๋ฉด์„œ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ํž˜์ด ๋  ๊ฒƒ์ด๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ, ์ฑ…์„ ํ†ตํ•œ ํ•™์Šต๋งŒ์œผ๋กœ๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ๋„ ๊นจ๋‹ฌ์•˜๋‹ค. ์‹ค์ œ๋กœ ์ ์šฉํ•ด๋ณด๊ณ  ์˜ค๋ฅ˜๋ฅผ ๊ฒฝํ—˜ํ•˜๋ฉฐ, ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ƒํ™ฉ์— ์ง๋ฉดํ•ด๋ณด๋Š” ๊ฒƒ์ด ์ œ๋Œ€๋กœ๋œ ํ•™์Šต์ธ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์„ ๋งŽ์ด ํ–ˆ๋‹ค.

์‹ค์ œ๋กœ ํ…Œ์ŠคํŠธ ํ•ด๋ณด์ง€ ์•Š์•˜๋‹ค๋ฉด ๋‚˜๋Š” ์•ž์œผ๋กœ ๊ณ„์† ์ž˜๋ชป๋œ ์ง€์‹์„ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ๊ฒ ์ง€..?

Ref

์˜ค๋ผํด ์„ฑ๋Šฅ ๊ณ ๋„ํ™” ์›๋ฆฌ์™€ ํ•ด๋ฒ• 1 - ์˜ˆ์Šค24
์ดˆ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ™˜๊ฒฝ์˜ ์—ฌ๋Ÿฌ ์ฐจ์„ธ๋Œ€ ์‹œ์Šคํ…œ ๊ตฌ์ถ• ํ”„๋กœ์ ํŠธ์—์„œ ์–ป์€ ์†Œ์ค‘ํ•œ ๊ฒฝํ—˜๊ณผ ๊ธฐ์ˆ  ๋…ธํ•˜์šฐ๋ฅผ ๋„๋ฆฌ ์ „ํŒŒํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“  ์ฑ…์ด๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ฑ๋Šฅ ์ตœ์ ํ™” ์ „๋ฌธ๊ฐ€๊ฐ€ ๋˜๊ธฐ๋ฅผ ๊ฟˆ๊พธ๋Š” ์ด๋“ค์—๊ฒŒ ์ตœ๊ณ ์˜ ์ง€์นจ์„œ๊ฐ€ ๋  ์ด ์ฑ…์€, ๊ณ ์„ฑ๋Šฅ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐœ๋ฐœ ๋ฐ ์šด์˜ ํ™˜...
https://www.yes24.com/Product/Goods/112343709
MySQL ์„ฑ๋Šฅ ์ตœ์ ํ™” - ์˜ˆ์Šค24
MySQL์„ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  DBA์™€ ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ์†”๋ฃจ์…˜ ๊ฐ€์ด๋“œ!ํŠธ์œ„ํ„ฐ๋‚˜ ํŽ˜์ด์Šค๋ถ๊ณผ ๊ฐ™์€ ์ตœ๊ทผ์˜ ์„œ๋น„์Šค๋Š” ๋Œ€์šฉ๋Ÿ‰์˜ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์ˆ˜๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ชจ๋ธ๋ง๊ณผ ์ตœ์ ์˜ ์šด์˜ ํ™˜๊ฒฝ์„ ์œ„ํ•œ DBMS ๊ตฌ์„ฑ, ์ตœ์ ํ™”๋œ ์ฟผ๋ฆฌ๋Š” ์ด๋Ÿฌํ•œ ์„œ๋น„์Šค ํ’ˆ์งˆ์— ๊ฐ€์žฅ ๋งŽ์€...
https://www.yes24.com/Product/Goods/4348383

Uploaded by N2T