Concurrency Control - KimJangHyeon/MyDBMS GitHub Wiki
CC
txn ํ ๋น
g_trx
- ๊ธ๋ก๋ฒ trx๋ก ํ ๋นํด์ค trx์ด๋ค.
fetch_and_add๋ก N๊น์ง ํ ๋น ๋ง์ฝ g_trx >= N์ด๋ฉด g_trx์ compare_and_swap์ ์ด์ฉํ์ฌ g_trx์ 1์ผ๋ก ์ ํ -> ์คํจ์, while๋ก ๊ณ์ ์๋
- ๋ค๋ฅธ thread๊ฐ g_trx๋ก ์ ๊ทผํ์ฌ g_trx์ ๊ฐ์ ์ฆ๊ฐ ์์ผฐ๊ธฐ ๋๋ฌธ์ ์คํจํ์ ๊ฐ๋ฅ์ฑ์ด ์์
๊ตฌํํ ํจ์ ๋ฐ ํด๋์ค
get_pid(tid, key)
-
find_leaf๋ฅผ ์ด์ฉํ์ฌ ํด๋น key์ ํด๋นํ๋ offset์ ๋ฐ์๋ค.
-
find, update๋ฐ์ ์ํํ์ง ์๊ธฐ ๋๋ฌธ์ ํ์ด์ง๊ฐ ๋ ์๊ฐ ์ผ์ ์์ ์ฆ, ํ์ด์ง์ isLeaf๋นํธ๊ฐ ํ์๋ ์ผ๋ ์๋ค. ๋ฐ๋ผ์ ์ด๋ ๊ฒ ๋ฐ์์จ offset์ ์์ ํ๋ค.
-
return ๊ฐ์ offset + tid๋ก ์ ํ๋ค.
-
์ฆ๋ช
๋ค์์ ๋ง์กฑํ๊ธฐ ์ํ ์กฐ๊ฑด์ n = n' ์ด๊ณ k = k'๋ฟ์ด๋ฏ๋ก (k์ k'์ด 1<= k, k` <= 10 ์ด๊ธฐ ๋๋ฌธ) pid๋ก ์ ํฉํ๋ค.
make_lock
- lock์ ๋ง๋๋ ํจ์์ด๋ค. CCํด๋์ค์ find_trx_pointerํจ์๋ฅผ ํธ์ถํ์ฌ ํด๋น ๋ฝ์ trx์ ์ฐ๊ฒฐ์์ผ์ค ์ฑ๋ก ๋์จ๋ค.
CC::get_trx
- trx๋ฅผ ํ ๋นํด์ค๋ค.(__sync_fetch_and_add๋ฅผ ์ฌ์ฉ)
๋ํ trx_arr์์ ๋น์ด์๋ ๊ณณ์ CAS๋ฅผ ํตํด์ ํ ๋นํด์ค๋ค. (get_trx๋ latch๋ก ์กํ์์ง ์๊ธฐ ๋๋ฌธ)
CC::marking_lock
- ๋ฝ์ ์ฐ๊ฒฐํด์ค๋ค.
- return ๊ฐ์ผ๋ก ์ด operation์ด ์คํ๊ฐ๋ฅํ ๊ฒฝ์ฐ 1์ ์๋ ๊ฒฝ์ฐ 0์ ๋ฐํํ๋ค.
buffer mult test
value๋ฅผ global๋ก ๋๊ณ 99๋ฒ์ find๋ง๋ค ์ด value๋ฅผ fetch and add๋ก ์ฆ๊ฐ ์ํจ ๊ฐ์ ์ ์ฉํ๋ update๋ฅผ ์ํํ๋ thread
5๊ฐ๋ฅผ ๋ง๋ค์๋ค.
๊ทธ๋ฆฌ๊ณ find์ ๊ฒฐ๊ณผ๋ฅผ lock์ ๊ฑธ์ด์ ๋ฐ๋ก ์ถ๋ ฅํ ์ ์๋๋กํ์๋ค.
์ด๋ ๋ค์๊ณผ ๊ฐ์ด ๋ฒํผ์ ์ฌ์ด์ฆ๋ 1๋ก ๋์ด checkpoint๊ฐ ์ผ์ด๋ ์ ์๋๋ก ํ์๋ค.
๊ฒฐ๊ณผ์ ๋ฐ๋ฅด๋ฉด ํ๋ฆฐํธ์ ์์๊ฐ ์๊ธฐ์ง ์๊ณ ์์ ํ linearํ๊ฒ ์ฆ๊ฐํ๋ ๊ฒ์ ๋ณผ ์ ์์๋ค.
์ฆ, ์
๋ฐ์ดํธ ๋์ค์ ๊ฐ์ด ์ฝํ์ง ์๊ณ (isolate)
ํ๋ฒ ์
๋ฐ์ดํธ ๋๊ฒ์ readํ ๋ ๋ฐ์ ์ด ๋๋ค.(durability)
๋ํ ๋ฒํผ์์ ๋์คํฌ๋ก ๋ด๋ ค๊ฐ๋ค ์ฌ๋ผ์ค๋ ์ฌ์ด์๋ ์์ ์ฑ์ด ๋ณด์ฅ๋จ์ ์ ์ ์๋ค.