INSERT INTO SELECT SHARED LOCK(row LOCK)
ํ
์คํธ 1
๋ชฉํ
Table๋จ์์ LOCK์ด ๊ฑธ๋ฆฌ๋๊ฐ? ์๋๋ฉดROW๋จ์์ LOCK์ด ๊ฑธ๋ฆฌ๋๊ฐ? (๋ ์ฝ๋ ๋ฝ)ROW๋จ์: ํน์ ๋ฐ์ดํฐ์๋งSHARED LOCK์ด ๊ฑธ๋ฆฌ๊ณ , ๋ค๋ฅธ๋ฐ์ดํฐ์CRUD์๋ ์ํฅ์ด ์๋๊ฐ?SHARED LOCK: ์ฝ๊ธฐ ๊ฐ๋ฅ. ์์ /์ญ์ ๋ถ๊ฐ
์๋๋ฆฌ์ค
Transaction Mode: Manual
1. Session 1
col1=1S๋ฝ ํ๋ ์๋primaryKey=1S๋ฝ ํ๋ ์ฑ๊ณต

2. Session 2
col1=2X๋ฝ ํ๋ ์๋primaryKey=2X๋ฝ ํ๋ ์ฑ๊ณต

3. Session 2
col1=1X๋ฝ ํ๋ ์๋ํ์ง๋ง Session 1 ์์ S๋ฝ์ ๊ฑธ๊ณ ์๊ธฐ์ ํธํ๋์ง ์์ WAITING.

4. Session 1 commit, Session 2 commit
๊ฒฐ๊ณผ
๋ฝ์ด ๊ฑธ๋ฆฌ์ง ์์ ๋ ์ฝ๋์๋ update๊ฐ ๊ฐ๋ฅํ๋ค.
S๋ฝ์ด ๊ฑธ๋ฆฐ ๋ ์ฝ๋์ X๋ฝ์ด ๋ค์ด์ค๋ฉด S๋ฝ์ด ํด์ ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค.
S๋ฝ๊ณผ X๋ฝ์ ํธํ๋์ง ์๋๋ค.
timeout์ ์ฃผ๋ฒ.
์ฆ InnoDB๋ ๋ ์ฝ๋๋ฝ์ผ๋ก ์์ง์ธ๋ค.
ํ์ง๋ง..
์ ๋ฆฌํ๋ฉด์ ์ต๊ทผ ์ฝ์ REAL MySQL์ ์ ๊ธ ํํธ๊ฐ ์๊ฐ๋์ ๋ค์ ์ฝ์ด๋ดค์ต๋๋ค.
์ด ๋ด์ฉ์ ์ฝ๊ณ ์์ ํ ์คํธ๋ฅผ ๋ค์ ๋ณด๋
where ์กฐ๊ฑด์ col1์ PK์ด๊ธฐ์ unique index๋ก ์ด๋ฏธ ์กํ์์ด ๋จ์ผ ๋ ์ฝ๋๋ฝ์ด ๊ฑธ๋ฆฝ๋๋ค.
ํ์ง๋ง index๊ฐ ์๋ col2๋ผ๋ฉด?
col2์ non unique index๋ฅผ ๊ฑธ๊ณ ์กฐํํ๋ค๋ฉด?
ํ
์คํธ 2
๋ชฉํ
index๊ฐ ์๋ col2๋ฅผ where ์กฐ๊ฑด์ผ๋ก ์คํํ๋ ๊ฒฝ์ฐ ๋ ์ฝ๋๋ฝ์ด ์ด๋ป๊ฒ ์กํ๋๊ฐ?
์๋๋ฆฌ์ค
์ด๊ธฐ ์ธํ ๋
1. Session 1
col2=bbbS๋ฝ ํ๋ ์๋.ํ์ง๋ง ๋ชจ๋ ๋ ์ฝ๋์ ๋ํด S๋ฝ ํ๋ ์ฑ๊ณต.

2. Session 2
col2=cccX๋ฝ ํ๋ ์๋.ํ์ง๋ง Session 1 ์์ ๋ชจ๋ ๋ ์ฝ๋์ S๋ฝ์ ๊ฑธ๊ณ ์๊ธฐ์ ํธํ๋์ง ์์ WAITING.

3. Session 1 commit, Session 2 commit
๊ฒฐ๊ณผ
index๊ฐ ์๋ค๋ฉด ๋ชจ๋ ๋ ์ฝ๋๊ฐ ๋ฝ์ ๊ฑธ๋ฆฐ๋ค.
ํ
์คํธ 3
๋ชฉํ
col2์ non unique index๋ฅผ ๊ฑธ๊ณ where ์กฐ๊ฑด์ผ๋ก ์คํํ๋ ๊ฒฝ์ฐ ๋ ์ฝ๋๋ฝ์ด ์ด๋ป๊ฒ ์กํ๋๊ฐ?
์๋๋ฆฌ์ค
1. Session 1
col2=bbbS๋ฝ ํ๋ ์๋primaryKey=3,4,5S๋ฝ ํ๋ ์ฑ๊ณตcol2๋ non unique index ์ด์ง๋ง
primaryKey=3,4S๋ฝ ํ๋ ์ฑ๊ณต.primaryKey=5๋ S๋ฝ์ด์ GAP๋ฝ์ผ๋ก ํ๋ํ๋๋ฐ ์ด๋ถ๋ถ์ ์ข ๋ ๊ณต๋ถํด์ผ๋ฉ๋๋ค.

2. Session 2
col2=cccX๋ฝ ํ๋ ์๋primaryKey=5,6X๋ฝ ํ๋ ์ฑ๊ณต๊ทผ๋ฐ unique index์ด๋ ๊ฒ๊ณผ ๋ค๋ฅด๊ฒ REC_NOT_GAP, GAP ๋ฝ๋ค์ด ์ถ๊ฐ๋ก ํ๋๋ฉ๋๋ค.

3. Session 2
col2=bbbX๋ฝ ํ๋ ์๋ํ์ง๋ง Session 1 ์์ S๋ฝ์ ๊ฑธ๊ณ ์๊ธฐ์ ํธํ๋์ง ์์ WAITING.

4. Session 1 commit, Session 2 commit
๊ฒฐ๊ณผ
ํ ์คํธ 1๊ณผ ๊ฒฐ๊ณผ๋ ๊ฐ์ง๋ง ๋ฝ์ด ๊ฑธ๋ฆฌ๋ ํํ๊ฐ ๋งค์ฐ ๋ค๋ฆ ๋๋ค.
์ต์ข
๊ฒฐ๋ก
innoDB์์ unique index์ ๋ํ INSERT INTO SELECT SHARED LOCK ๋ ๋ ์ฝ๋ ๋ฝ์ด ๋ง์ต๋๋ค.
INSERT INTO SELECT SHARED LOCK ๋ ๋ ์ฝ๋ ๋ฝ์ด ๋ง์ต๋๋ค.ํ์ง๋ง non unique index์ ๊ฒฝ์ฐ ๋ฝ์ด ๊ฑธ๋ฆฌ๋ ํํ๊ฐ ๋งค์ฐ ๋ค๋ฆ ๋๋ค.
IS, IX, ๊ฐญ ๋ฝ๋ฑ์ ๋ํ ๊ณต๋ถ๊ฐ ๋ถ์กฑํด ์ ํํ ์ด๋ค ์ฐจ์ด๊ฐ ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์ฌ์ง์ด no index ์ธ ๊ฒฝ์ฐ๋ ์ ์ฒด ๋ ์ฝ๋ ๋ฝ์ผ๋ก ํ ์ด๋ธ ๋ฝ๊ณผ ๊ฐ์ ์ํ๊ฐ ๋ฉ๋๋ค.
ํ์ง๋ง ์ค๋ฌด์์๋ ํฐ ๋ฌธ์ ๊ฐ ์์ ๊ฒ์ผ๋ก ์์๋ฉ๋๋ค.
์ด ์ด์๋ ์ผ๋ฐ์ ์ด์ง ์์ ์ ๋ฌด ํ๋ฆ์์ ์๊ธฐ ์์ ๊ฐ ํธ๋์ญ์ ์กฐ์์ ์๋ชปํ ์ธ์ ์ค์๊ฐ ๋ ํฝ๋๋ค. (์์ ์ ์์ฒญ)
์ค๋ฌด์์ ์ฌ์ฉ๋๋ ํ ์ด๋ธ์ ์ต์ํ non unique index๊ฐ ๊ฑธ๋ ค ์์ ๊ฒ์ ๋๋ค.
Last updated
Was this helpful?