์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- react-router
- java
- ์๋ฐ
- ํ ์ฝํ ์ฝ
- react
- sw expert academy
- ์๊ณ ๋ฆฌ์ฆ
- ํ๋ก๊ทธ๋๋จธ์ค
- axios
- redux-saga
- redux-toolkit
- ํญํด99
- maeil-mail
- Get
- useDispatch
- ์ด์ฝํ
- ๋งค์ผ๋ฉ์ผ
- programmers
- Algorithm
- redux
- SW
- createSlice
- react-redux
- C++
- json-server
- ๋ฆฌ์กํธ
- ํญํดํ๋ฌ์ค
- Python
- JavaScript
- ์ฝ๋ฉํ ์คํธํฉ๊ฒฉ์๋๊ธฐ
- Today
- Total
Binary Journey
[๋งค์ผ๋ฉ์ผ] ๊ฐญ๋ฝ(Gap Lock)๊ณผ ๋ฅ์คํธํค ๋ฝ(Next-Key Lock)์ด๋ ๋ฌด์์ด๋ฉฐ, ์ด๋ป๊ฒ Phantom Read๋ฅผ ๋ฐฉ์งํ๋์? ๋ณธ๋ฌธ
[๋งค์ผ๋ฉ์ผ] ๊ฐญ๋ฝ(Gap Lock)๊ณผ ๋ฅ์คํธํค ๋ฝ(Next-Key Lock)์ด๋ ๋ฌด์์ด๋ฉฐ, ์ด๋ป๊ฒ Phantom Read๋ฅผ ๋ฐฉ์งํ๋์?
binaryJournalist 2024. 12. 20. 13:58๐ก ๋งค์ผ๋ฉ์ผ์ ๊ธฐ์ ๋ฉด์ ๊ด๋ จ ์ง๋ฌธ์ ๋ฉ์ผ๋ก ๋งค์ผ ๋ณด๋ด์ฃผ๋ ๊ตฌ๋ ์๋น์ค์ ๋๋ค.
๐ก๋งค์ผ๋ฉ์ผ ์ฑ๋ฆฐ์ง๋ ์ ๊ฐ์ธ์ ์ธ ์ฑ๋ฆฐ์ง๋ก ๋งค์ผ๋ฉ์ผ์์ ๋ณด๋ด์ฃผ๋ ํ๋ฃจ์น ๋ฉ์ผ์ ๋ํ ๋ต๋ณ์ ๋ธ๋ก๊ทธ ํฌ์คํธ๋ก ์์ฑํฉ๋๋ค.
๊ฐญ๋ฝ(Gap Lock)๊ณผ ๋ฅ์คํธํค ๋ฝ(Next-Key Lock)์ด๋ ๋ฌด์์ด๋ฉฐ, ์ด๋ป๊ฒ Phantom Read๋ฅผ ๋ฐฉ์งํ๋์?
(2024.12.19 ์ง๋ฌธ)
๋์ ๋ต์
๊ฐญ ๋ฝ(Gap Lock
์ ํน์ ์ธ๋ฑ์ค ๋ ์ฝ๋ ์ฌ์ด์ ๊ฐ๊ฒฉ์ ์ ๊ทธ๋ ๋ฒ์ ๋ฝํน ๋ฉ์ปค๋์ฆ์ผ๋ก ๋ค๋ฅธ ํธ๋์ญ์
์ด ์๋ก์ด ๋ ์ฝ๋๊ฐ ๋์ผํ ๋ฒ์์ ์ธ๋ฑ์ค ๋ ์ฝ๋ ์ฌ์ด์ ์ฝ์
๋๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
๋ฅ์คํธํค ๋ฝ(Next-Key Lock)
์ Record Lock
(๋ ์ฝ๋ ๋ฝ)๊ณผ Gap Lock
์ ์กฐํฉ์ผ๋ก ํน์ ์ธ๋ฑ์ค ๋ ์ฝ๋๋ฅผ ์ ๊ธ ๋ฟ๋ง ์๋๋ผ ์ธ๋ฑ์ค ๋ ์ฝ๋ ์๋ค ์ฌ์ด์ ๊ฐ๊ฒฉ๋ ํจ๊ป ์ ๊ทธ๋ ๋ฝํน ๋ฉ์ปค๋์ฆ์
๋๋ค.
Phantom Read
๋ ํธ๋์ญ์
์ด ์คํ๋๋ ๋์ ๋์ผํ ์ฟผ๋ฆฌ๋ฅผ ์ฌ๋ฌ ๋ฒ ์ํํ์ ๋, ์ค๊ฐ์ ๋ค๋ฅธ ํธ๋์ญ์
์ด ๋ฐ์ดํฐ ์ฝ์
, ์ญ์ ๋ฑ์ ์์
์ ์ํํจ์ผ๋ก์จ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๋ ํ์์ ๋งํฉ๋๋ค. ์ด๋ก ์ธํด "์ ๋ น(Phantom)" ๋ ์ฝ๋๊ฐ ๋ํ๋๊ฑฐ๋ ์ฌ๋ผ์ง๋ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค.
employees
ํ
์ด๋ธ์ด ์๋์ ๊ฐ๊ณ salary
์ปฌ๋ผ์ ๋จ์ผ ์ธ๋ฑ์ค๊ฐ ์ค์ ๋์ด ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
name | salary |
A | 50,000 |
B | 70,000 |
C | 90,000 |
Transaction A
์์ salary
๊ฐ 60,000
๋ถํฐ 80,000
๊น์ง์ธ ์ง์ ์กฐํ ์
-- Transaction A
SELECT * FROM employees WHERE salary BETWEEN 60,000 AND 80,000 FOR UPDATE;
์กฐํ ์ถ๋ ฅ๊ฐ์ 70,000
์ด ๋๋ฉฐ
๊ฐญ ๋ฝ(Gap Lock)
์ ๊ฒฝ์ฐ
์ธ๋ฑ์ค ๋ ์ฝ๋ ์ฌ์ด์ ๊ฐ๊ฒฉ์ ์ ๊ทธ๊ธฐ ๋๋ฌธ์ 50,000 - 70,000
๊ณผ 70,000 - 90,000
๊ตฌ๊ฐ์ ์ ๊ธ๋๋ค.
๋ง์ฝ ์๋ก์ด ํธ๋์ญ์
์ธ Transaction B
์์ ์ ๊ธด ๊ตฌ๊ฐ ๋ด์ salary
๊ฐ์ ๊ฐ์ง ์ง์ ๋ ์ฝ๋ insert
๋ช
๋ น์ ์ฐจ๋จ๋์ด ์๋ก์ด ๋ ์ฝ๋ ์ฝ์
๋ก ์ธํ Phantom Read
๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
-- ๊ฐญ ๋ฝ(Gap Lock) ์ํ์์ Transaction B ์๋
INSERT INTO employees VALUES (์ด๋ฆ, 75,000); -- ์ฐจ๋จ๋จ
INSERT INTO employees VALUES (์ด๋ฆ, 65,000); -- ์ฐจ๋จ๋จ
๋ฅ์คํธํค ๋ฝ(Next-Key Lock)
์ ๊ฒฝ์ฐ
๊ฐญ ๋ฝ(Gap Lock)
๊ณผ ๋ ์ฝ๋ ๋ฝ(Record Lock)
์ด ๊ฐ์ด ์ผ์ด๋๊ธฐ ๋๋ฌธ์ ์กฐํ ๋ถ๋ถ์ธ ๊ฐ๋ณ ์ธ๋ฑ์ค 70,000
๋ ์ฝ๋๋ฅผ ์ ๊ทธ๊ณ ์์ ๊ฐญ ๋ฝ(Gap Lock)
์์ ์ค๋ช
ํ ๊ฒ๊ณผ ๊ฐ์ด ์ธ๋ฑ์ค ๋ ์ฝ๋ ์ฌ์ด์ ๊ฐ๊ฒฉ์ธ 50,000 - 70,000
๊ณผ 70,000 - 90,000
๊ตฌ๊ฐ์ ์ ๊ธ๋๋ค.
์ด ์ํ์์ salary
๊ฐ 70,000
์ธ ๋ ์ฝ๋๋ฅผ update
ํ๊ฑฐ๋ 50,000 - 70,000
๊ณผ 70,000 - 90,000
๊ตฌ๊ฐ์ ์๋ก์ด ๋ ์ฝ๋๋ฅผ insert
์ ๋ช
๋ น์ ์ฐจ๋จ๋์ด Phantom Read
๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
-- ๋ฅ์คํธํค ๋ฝ(Next-Key Lock) ์ํ์์ Transaction B ์๋
UPDATE employees SET salary = 75,000 WHERE salary = 70,000; -- ์ฐจ๋จ๋จ
INSERT INTO employees VALUES (์ด๋ฆ, 75,000); -- ์ฐจ๋จ๋จ
DELETE FROM employees WHERE salary = 70,000; -- ์ฐจ๋จ๋จ
๋ชจ๋ฒ ๋ต์
์ง๋ฌธ์ ๋ชฉ์
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋์์ฑ ์ ์ด์ ๊ด๋ จ๋ ์ค์ํ ๊ฐ๋ ์ ์์์ผ ํฉ๋๋ค. ๋ฝํน ๋ฉ์ปค๋์ฆ์ ์ดํดํ๊ณ ์ ์ ํ ํ์ฉํ๋ฉด, ๋์์ฑ์ ์ ์งํ๋ฉด์๋ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๋ ์์ ์ ์ธ ์์คํ ์ ์ค๊ณํ ์ ์์ต๋๋ค.
์ฃผ์ ๊ฐ๋
Phantom Read
ํธ๋์ญ์
์ด ์คํ๋๋ ๋์ ๋์ผํ ์ฟผ๋ฆฌ๋ฅผ ์ฌ๋ฌ ๋ฒ ์ํํ์ ๋, ์ค๊ฐ์ ๋ค๋ฅธ ํธ๋์ญ์
์ด ๋ฐ์ดํฐ ์ฝ์
, ์ญ์ ๋ฑ์ ์์
์ ์ํํจ์ผ๋ก์จ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๋ ํ์์ ๋งํฉ๋๋ค. ์ด๋ก ์ธํด "์ ๋ น(Phantom)" ๋ ์ฝ๋๊ฐ ๋ํ๋๊ฑฐ๋ ์ฌ๋ผ์ง๋ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค.
์ฃผ๋ก ์ฝ๊ธฐ ์ผ๊ด์ฑ(Read Consistency)
์ ์ ์งํ๋ ๊ณผ์ ์์ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ์
๋๋ค.
-- Transaction A
SELECT * FROM employees WHERE salary BETWEEN 1000 AND 2000; -- 10๊ฑด ์กฐํ
-- Transaction B๊ฐ ์ ์ง์ ์ถ๊ฐ
SELECT * FROM employees WHERE salary BETWEEN 1000 AND 2000; -- 11๊ฑด ์กฐํ
๊ฐญ๋ฝ(Gap Lock)
- ํน์ ์ธ๋ฑ์ค ๋ ์ฝ๋ ์ฌ์ด์ ๊ฐ๊ฒฉ์ ์ ๊ทธ๋ ๋ฐฉ์์ ๋๋ค.
- ์๋ก์ด ๋ ์ฝ๋๊ฐ ๊ทธ ๊ฐ๊ฒฉ์ ์ฝ์ ๋๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
- ๊ฐญ๋ฝ์ ๋ ์ฝ๋ ์์ฒด๊ฐ ์๋ ๋ ์ฝ๋ ๊ฐ์ ๊ฐ๊ฒฉ(gap)์ ์ ๊ทธ๋ ๋ฐฉ์์ผ๋ก ์๋ํฉ๋๋ค. ์ด๋ก ์ธํด, ๋ค๋ฅธ ํธ๋์ญ์
์ด ๋์ผํ ๋ฒ์ ๋ด์์ ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ์ฝ์
ํ๊ฑฐ๋ ์ญ์ ํ์ง ๋ชปํ๋๋ก ๋ง์ต๋๋ค.
- ๊ธฐ์กด ๋ ์ฝ๋ ๊ฐ์ ๊ฐ๊ฒฉ์ ๋ณดํธํ์ฌ ์๋ก์ด ๋ ์ฝ๋์ ์ฝ์ ์ ๋ฐฉ์งํฉ๋๋ค.
- ๊ฐญ ๋ฝ์ ๋ฒ์ ๋ด์ ํน์ ๋ ์ฝ๋๊ฐ ์กด์ฌํ์ง ์์ ๋ ์ ์ฉ๋ฉ๋๋ค.
- ํธ๋์ญ์ ์ด ํน์ ๋ฒ์ ๋ด์์ ๋ฐ์ดํฐ์ ์ฝ์ ์ ๋ง์ ํฌํ ์ฝ๊ธฐ(Phantom Read) ํ์์ ๋ฐฉ์งํฉ๋๋ค.
- ์์:
salary
์ธ๋ฑ์ค์์1000
๊ณผ2000
์ฌ์ด์ ๊ฐ๊ฒฉ์ ์ ๊ทธ๋ฉด, ๋ค๋ฅธ ํธ๋์ญ์ ์ ์ด ๋ฒ์์ ์๋ก์ด ๋ ์ฝ๋๋ฅผ ์ฝ์ ํ ์ ์์ต๋๋ค.
๋ฅ์คํธํค ๋ฝ(Next-Key Lock)
Record Lock
(๋ ์ฝ๋ ๋ฝ)๊ณผGap Lock
์ ์กฐํฉ์ ๋๋ค.- ํน์ ๋ ์ฝ๋๋ฟ๋ง ์๋๋ผ ํด๋น ๋ ์ฝ๋์ ๋ค์ ๋ ์ฝ๋ ์ฌ์ด์ ๊ฐญ๋ ์ ๊ทธ๋ ์ ๊ธ ๋ฐฉ์์
๋๋ค.
- ํน์ ์ธ๋ฑ์ค ๋ ์ฝ๋์ ๊ทธ ์ฃผ๋ณ์ ๊ฐญ์ ๋์์ ์ ๊ทธ๋ ๋ฝ์ ๋๋ค.
- ๋ ์ฝ๋ ์์ฒด์ ๋ณ๊ฒฝ๊ณผ ํจ๊ป ๊ทธ ์ฃผ๋ณ ๊ณต๊ฐ์ ๋ณ๊ฒฝ๋ ๋์์ ์ ์ดํ ์ ์์ต๋๋ค.
- ๋ฅ์คํธํค ๋ฝ์ ํน์ ๋ ์ฝ๋์ ๊ทธ ์ฃผ๋ณ ๊ณต๊ฐ์ ์ ๊ทธ๊ธฐ ๋๋ฌธ์, ๋ค๋ฅธ ํธ๋์ญ์ ์ด ์๋ก์ด ๋ ์ฝ๋๋ฅผ ์ฝ์ ํ์ฌ ํฌํ ๋ฆฌ๋๋ฅผ ๋ฐ์์ํค๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
- InnoDB์ ๊ธฐ๋ณธ ์ ๊ธ ๋ฐฉ์์ ๋๋ค.
-- salary ์ปฌ๋ผ์ ์ธ๋ฑ์ค๊ฐ ์๋ค๊ณ ๊ฐ์
SELECT * FROM employees WHERE salary BETWEEN 1000 AND 2000 FOR UPDATE;
salary
๊ฐ1000
-2000
๋ฒ์์ ์ค์ ๋ ์ฝ๋๋ค์ ์ ๊ทธ๊ณ (Record Lock
)- ํด๋น ๋ฒ์ ๋ด์ ๋ชจ๋ ๊ฐ๊ฒฉ์ ์ ๊ธ๋๋ค (
Gap Lock
) - ๊ฒฐ๊ณผ์ ์ผ๋ก
Next-Key Lock
์ด ์ ์ฉ๋ฉ๋๋ค.
๋ ์ฝ๋ ๋ฝ(Record Lock)
๋ ์ฝ๋ ๋ฝ(Record Lock)์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ํ ๋จ์ ์ ๊ธ ๋ฐฉ์์ ๋๋ค.
- ๊ฐ๋ณ ์ธ๋ฑ์ค ๋ ์ฝ๋์ ๋ํ ์ ๊ธ์ ๋๋ค.
- ๋ค๋ฅธ ํธ๋์ญ์ ์ด ํด๋น ๋ ์ฝ๋๋ฅผ ์์ ํ๊ฑฐ๋ ์ญ์ ํ๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
- ํญ์ ์ธ๋ฑ์ค ๋ ์ฝ๋๋ฅผ ์ ๊ธ๋๋ค (ํ ์ด๋ธ์ ์ธ๋ฑ์ค๊ฐ ์๋ค๋ฉด ์จ๊ฒจ์ง ํด๋ฌ์คํฐํ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉ)
-- Transaction A
SELECT * FROM users WHERE id = 1 FOR UPDATE;
-- ์ด ์์ ์์ id๊ฐ 1์ธ ๋ ์ฝ๋์ ๋ํด ๋ ์ฝ๋ ๋ฝ์ด ์ค์ ๋จ
-- Transaction B๋ ์ด ์์ ์์ ๋์ผ ๋ ์ฝ๋ ์์ ๋ถ๊ฐ
UPDATE users SET name = 'New Name' WHERE id = 1;
-- Transaction B๋ Transaction A๊ฐ ์ปค๋ฐ๋๊ฑฐ๋ ๋กค๋ฐฑ๋ ๋๊น์ง ๋๊ธฐ
๊ฐญ ๋ฝ(Gap Lock)๊ณผ์ ์ฐจ์ด
- ๋ ์ฝ๋ ๋ฝ: ์ค์ ์กด์ฌํ๋ ๋ ์ฝ๋๋ง ์ ๊ทธ๋ฉฐ ํน์ ๋ ์ฝ๋์ ๋ํ ๋ณ๊ฒฝ์ ๋ง์ต๋๋ค.
- ๊ฐญ ๋ฝ: ๋ ์ฝ๋ ์ฌ์ด์ ๊ฐ๊ฒฉ์ ์ ๊ธ. ํน์ ์ธ๋ฑ์ค ๋ฒ์์ "์ฌ์ด"๋ฅผ ์ ๊ทธ๋ฉฐ, ํด๋น ๋ฒ์ ๋ด์์ ์๋ก์ด ๋ ์ฝ๋ ์ฝ์ ์ด๋ ์ญ์ ๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
๊ฐญ๋ฝ์ ํน์ง
- ์ด๋ฏธ ์กด์ฌํ๋ ๋ ์ฝ๋๋ ๊ฐญ๋ฝ์ ์ํด ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.
- ์ฃผ๋ก ์ธ๋ฑ์ค ๊ธฐ๋ฐ ๊ฒ์์์ ๋ฐ์ํ๋ฉฐ, ํ ์ด๋ธ ํ ์ค์บ์์๋ ๋์ํ์ง ์์ต๋๋ค.
- ์ฝ์ , ์ญ์ ์ ๊ฐ์ ํฌํ ๋ฆฌ๋ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
- ๊ฐญ๋ฝ์ ๋ ์ฝ๋๋ฟ๋ง ์๋๋ผ ์ธ๋ฑ์ค ๋ฒ์ ์ ์ฒด๋ฅผ ์ ๊ทธ๋ฏ๋ก, ๋์์ฑ์ ๋ฎ์ถ ์ ์์ต๋๋ค.
- ๋๊ท๋ชจ ๋ฒ์ ๊ฒ์ ์
๋ฐ๋๋ฝ(Deadlock)
์ด ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์ฆ๊ฐํฉ๋๋ค.
๋ฅ์คํธํค ๋ฝ(Next-Key Lock)๊ณผ์ ์ฐจ์ด
- ๋ ์ฝ๋ ๋ฝ: ๋จ์ผ ๋ ์ฝ๋๋ง ์ ๊ธ๋๋ค.
- ๋ฅ์คํธํค ๋ฝ: ๋ ์ฝ๋์ ๊ทธ ์์ ๊ฐญ์ ํจ๊ป ์ ๊ธ๋๋ค.
๋ฅ์คํธํค๋ฝ์ ํน์ง
- ํน์ ๋ ์ฝ๋์ ๋ณ๊ฒฝ ๋ฐฉ์ง(Record Lock)
- ํน์ ๋ฒ์์์ ์๋ก์ด ๋ ์ฝ๋ ์ฝ์ ์ ๋ฐฉ์ง(Gap Lock)
- ๋ ์ฝ๋ ์์ฒด์ ๊ฐญ ๋ชจ๋๋ฅผ ์ ๊ธ์ผ๋ก์จ ๋ค๋ฅธ ํธ๋์ญ์ ์ด ์กฐ๊ฑด์ ๋ถํฉํ๋ ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ์ง ๋ชปํ๊ฒ ํ์ฌ ํฌํ ๋ฆฌ๋๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
- ์ธ๋ฑ์ค๊ฐ ์๋ ๊ฒฝ์ฐ ๋ฅ์คํธํค๋ฝ์ด ์๋ ํ ์ด๋ธ๋ฝ์ด ์ ์ฉ๋ ์ ์์ต๋๋ค.
- MySQL์์ ๊ธฐ๋ณธ ๊ฒฉ๋ฆฌ ์์ค์ธ REPEATABLE READ์์ ํฌํ ๋ฆฌ๋๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ฅ์คํธ ํค ๋ฝ์ด ํ์ฑ๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํ์ง๋ง ๋ฐ๋๋ฝ ๋ฐ์ ๊ฐ๋ฅ์ฑ์ด ์ฆ๊ฐํฉ๋๋ค.
Phantom Read ์ ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค
Phantom Read ๋ฐ์ ๊ฐ๋ฅ ๊ฒฉ๋ฆฌ ์์ค
Read Committed
: ์ปค๋ฐ๋ ๋ฐ์ดํฐ๋ง ์ฝ์ ์ ์์ง๋ง ๋ฐ๋ณต์ ์ธ ์ฝ๊ธฐ์์ ํฌํ ํ์ด ๋ํ๋ ์ ์์ต๋๋ค.Repeatable Read
: ํ ๋ฒ ์ฝ์ ๋ฐ์ดํฐ๊ฐ ๋ฐ๋ณต์ ์ผ๋ก ์ฝํ ๋๋ ์ผ๊ด์ฑ์ ๋ณด์ฅํ์ง๋ง ์๋ก์ด ํ์ด ์ฝ์ ๋์ด ํฌํ ํ์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
Serializable
๊ฒฉ๋ฆฌ ์์ค์์๋ Phantom Read
๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค. ์ด ์์ค์์๋ ์ฝ๊ธฐ์ ์ฐ๊ธฐ์ ๋ํด ๋ฒ์ ์ ๊ธ(range lock)
์ ์ ์ฉํ๋ฏ๋ก, ๋ค๋ฅธ ํธ๋์ญ์
์ด ๋ฒ์ ๋ด์์ ์ฝ์
, ์ญ์ , ๊ฐฑ์ ์ ์ํํ์ง ๋ชปํ๊ฒ ๋ฉ๋๋ค.