โ๏ธ ์ ๊ธ(Lock)๊ณผ ํธ๋์ญ์
- ์ ๊ธ: ๋์์ฑ์ ์ ์ดํ๊ธฐ ์ํ ๊ธฐ๋ฅ
- ํธ๋์ญ์ : ๋ฐ์ดํฐ์ ์ ํฉ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํ ๊ธฐ๋ฅ
1 ํธ๋์ญ์
- ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์์ ๊ณ ๋ฏผํด์ผ ํ ๋ฌธ์ ๋ฅผ ์ค์ฌ์ฃผ๋ ์์ฃผ ํ์์ ์ธ DBMS์ ๊ธฐ๋ฅ
- ์์ ์ ์์ ์ฑ์ ๋ณด์ฅํด ์ฃผ๋ ๊ฒ
- ๋
ผ๋ฆฌ์ ์ธ ์์
์
์ ๋ชจ๋ ์๋ฒฝํ๊ฒ ์ฒ๋ฆฌํ๊ฑฐ๋, ์ฒ๋ฆฌํ์ง ๋ชปํ ๊ฒฝ์ฐ
์์ํ๋ก ๋ณต๊ตฌํด์ ์์ ์ ์ผ๋ถ๋ง ์ ์ฉ๋๋ ํ์(Partial update)์ด ๋ฐ์ํ์ง ์๊ฒ ๋ง๋ค์ด์ฃผ๋ ๊ธฐ๋ฅ
- ํธ๋์ญ์ ์ ์ง์ํ๋ ์คํ ๋ฆฌ์ง ์์ง : InnoDB
- ํธ๋์ญ์ ์ ์ง์ํ์ง ์๋ ์คํ ๋ฆฌ์ง ์์ง : MyISAM, MEMORY ๋ฑ
โ๏ธ ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค :
ํ๋์ ํธ๋์ญ์ ๋ด์์ ๋๋ ์ฌ๋ฌ ํธ๋์ญ์ ๊ฐ์ ์์ ๋ด์ฉ์
์ด๋ป๊ฒ ๊ณต์ ํ๊ณ ์ฐจ๋จํ ๊ฒ์ธ์ง๋ฅผ ๊ฒฐ์ ํ๋ ๋ ๋ฒจ์ ์๋ฏธํ๋ค.
1.1 MySQL์์์ ํธ๋์ญ์
ํ๋์ ์ฟผ๋ฆฌ๊ฐ ์๋ ๋ ๊ฐ ์ด์์ ์ฟผ๋ฆฌ๊ฐ ์๋ ๊ด๊ณ์์ด
- ๋ ผ๋ฆฌ์ ์ธ ์์ set ์์ฒด๊ฐ 100% ์ ์ฉ๋๊ฑฐ๋(COMMIT์ ์คํํ์ ๋)
- ์๋ฌด๊ฒ๋ ์ ์ฉ๋์ง ์์์ผํจ(ROLLBACK ๋๋ ํธ๋์ญ์
์ ROLLBACK์ํค๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ ๋)
์ ๋ณด์ฅํด ์ฃผ๋ ๊ฒ
1.2 ์ฃผ์์ฌํญ
ํ๋ก๊ทธ๋จ์ ์ฝ๋๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์ ์ ๊ฐ์ง๊ณ ์๋ ๋ฒ์์
ํธ๋์ญ์ ์ด ํ์ฑํ ๋์ด ์๋ ํ๋ก๊ทธ๋จ์ ๋ฒ์๋ฅผ ์ต์ํํ๋ ๊ฒ์ด ์ข์
(์ต์์ ์ฝ๋์๋ง ์ ์ฉํ๋ ๊ฒ์ด ์ข์)ํ๋ก๊ทธ๋จ์ ์ฝ๋์์ ๋ผ์ธ ์๋ ํ๋ ์ค์ด๋ผ๊ณ ํ๋๋ผ๋ ๋คํธ์ํฌ ์์ ์ด ์๋ ๊ฒฝ์ฐ์๋
๋ฐ๋์ ํธ๋์ญ์ ์์ ๋ฐฐ์ ํด์ผ ํจ
โก๏ธ ์ด๋ฌํ ์ค์๋ก ์ธํด DBMS ์๋ฒ๊ฐ ๋์ ๋ถํ ์ํ๋ก ๋น ์ง๊ฑฐ๋
์ํํ ์ํ์ ๋น ์ง๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฃผ์ํ์
2 MySQL ์์ง์ ์ ๊ธ
MySQL์์ ์ฌ์ฉ๋๋ ์ ๊ธ(๊ฑฐ์์ ๋ถ๋ฅ)
- MySQL ์์ง ๋ ๋ฒจ
- MySQL ์๋ฒ์์ ์คํ ๋ฆฌ์ง ์์ง์ ์ ์ธํ ๋๋จธ์ง ๋ถ๋ถ
- ์คํ ๋ฆฌ์ง ์์ง ๋ ๋ฒจ
- ๋ชจ๋ ์คํ ๋ฆฌ์ง ์์ง์ ์ํฅ์ ๋ฏธ์น์ง๋ง,
์คํ ๋ฆฌ์ง ์์ง ๋ ๋ฒจ์ ์ ๊ธ์ ์คํ ๋ฆฌ์ง ์์ง ๊ฐ ์ํธ ์ํฅ์ ๋ฏธ์น์ง๋ ์์
- ๋ชจ๋ ์คํ ๋ฆฌ์ง ์์ง์ ์ํฅ์ ๋ฏธ์น์ง๋ง,
MySQL ์์ง ์ ๊ธ
- ๊ธ๋ก๋ฒ๋ฝ
- ํ ์ด๋ธ๋ฝ
- ๋ค์๋๋ฝ
- ๋ฉํ๋ฐ์ดํฐ๋ฝ
2.1 ๊ธ๋ก๋ฒ ๋ฝ(GLOBAL LOCK)
1
FLUSH TABLES WITH READ LOCK
InnoDB ์คํ ๋ฆฌ์ง ์์ง์ ํธ๋์ญ์
์ ์ง์ํ๊ธฐ ๋๋ฌธ์
์ผ๊ด๋ ๋ฐ์ดํฐ ์ํ๋ฅผ ์ํด ๋ชจ๋ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์์
์ ๋ฉ์ถ ํ์๋ ์๋ค.
MySQL 8.0๋ถํฐ๋ InnoDB๊ฐ ๊ธฐ๋ณธ ์คํ ๋ฆฌ์ง ์์ง์ผ๋ก ์ฑํ๋๋ฉด์ ์กฐ๊ธ ๋ ๊ฐ๋ฒผ์ด ๊ธ๋ก๋ฒ ๋ฝ์ ํ์์ฑ์ด ์๊ฒผ๋ค.
- ํ ์ธ์
์์ ๊ธ๋ก๋ฒ ๋ฝ์ ํ๋ํ๋ฉด
๋ค๋ฅธ ์ธ์ ์์ SELECT๋ฅผ ์ ์ธํ ๋๋ถ๋ถ์ DDL ๋ฌธ์ฅ์ด๋ DML ๋ฌธ์ฅ์ ์คํํ๋ ๊ฒฝ์ฐ
๊ธ๋ก๋ฒ ๋ฝ์ด ํด์ ๋ ๋๊น์ง ํด๋น ๋ฌธ์ฅ์ด ๋๊ธฐ ์ํ๋ก ๋จ์
- MySQL์์ ์ ๊ณตํ๋ ์ ๊ธ ๊ฐ์ด๋ฐ ๊ฐ์ฅ ๋ฒ์๊ฐ ํผ
- ์ํฅ์ ๋ฏธ์น๋ ๋ฒ์๋ MySQL ์๋ฒ ์ ์ฒด
- ์์ ๋์ ํ ์ด๋ธ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๋ค๋ฅด๋๋ผ๋ ๋์ผํ๊ฒ ์ํฅ์ ๋ฏธ์นจ
- ์ฌ์ฉ
- ์ฌ๋ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์กด์ฌํ๋ MyISAM์ด๋ MEMORY ํ
์ด๋ธ์ ๋ํด
mysqldump๋ก ์ผ๊ด๋ ๋ฐฑ์ ์ ๋ฐ์์ผ ํ ๋๋ ๊ธ๋ก๋ฒ ๋ฝ์ ์ฌ์ฉ
- ์ฌ๋ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์กด์ฌํ๋ MyISAM์ด๋ MEMORY ํ
์ด๋ธ์ ๋ํด
โ๏ธ ๋ฐฑ์ ๋ฝ
MySQL 8.0 ๋ฒ์ ๋ถํฐ๋ Xtrabackup์ด๋ Enterprise Backup๊ณผ ๊ฐ์
๋ฐฑ์ ํด๋ค์ ์์ ์ ์ธ ์คํ์ ์ํด ๋ฐฑ์ ๋ฝ์ด ๋์
- ํน์ ์ธ์ ์์ ๋ฐฑ์ ๋ฝ์ ํ๋ํ๋ฉด
๋ชจ๋ ์ธ์ ์์ ๋ค์๊ณผ ๊ฐ์ด ํ ์ด๋ธ์ ์คํค๋ง๋ ์ฌ์ฉ์์ ์ธ์ฆ ๊ด๋ จ ์ ๋ณด๋ฅผ ๋ณ๊ฒฝํ ์ ์๊ฒ ๋จ- ์ผ๋ฐ์ ์ธ ํ ์ด๋ธ์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ํ์ฉ
2.2 ํ ์ด๋ธ ๋ฝ(Table Lock)
- ๊ฐ๋ณ ํ ์ด๋ธ ๋จ์๋ก ์ค์ ๋๋ ์ ๊ธ
- ํ ์ด๋ธ ๋ฐ์ดํฐ ๋๊ธฐํ๋ฅผ ์ํ ์ ๊ธ
- MyISAM๋ฟ ์๋๋ผ InnoDB ์คํ ๋ฆฌ์ง ์์ง์ ์ฌ์ฉํ๋ ํ ์ด๋ธ๋ ๋์ผํ๊ฒ ์ค์ ๊ฐ๋ฅ
- ๋ช ์์ ๋๋ ๋ฌต์์ ์ผ๋ก ํน์ ํ ์ด๋ธ์ ๋ฝ์ ํ๋ํ ์ ์์
๋ช ์์ ํ ์ด๋ธ๋ฝ
ํ ์ด๋ธ๋ฝ ๋ช ์์ ๋ช ๋ น์ด
1
LOCK TABLES table_name [ READ | WRITE ]
- UNLOCK TABLES ๋ช ๋ น์ผ๋ก ์ ๊ธ์ ๋ฐ๋ฉ(ํด์ )
- ํน๋ณํ ์ํฉ์ด ์๋๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉํ ํ์๊ฐ ๊ฑฐ์ ์์
๋ฌต์์ ํ ์ด๋ธ๋ฝ
- MyISAM์ด๋ MEMORY ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ฉด ๋ฐ์
- MySQL ์๋ฒ๊ฐ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๋ ํ
์ด๋ธ์ ์ ๊ธ์ ์ค์ ํ๊ณ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ ํ,
์ฆ์ ์ ๊ธ์ ํด์ ํ๋ ํํ๋ก ์ฌ์ฉ๋จ - ์ฟผ๋ฆฌ๊ฐ ์คํ๋๋ ๋์ ์๋์ผ๋ก ํ๋๋๋ค๊ฐ ์ฟผ๋ฆฌ๊ฐ ์๋ฃ ํ ์๋ ํด์
- InnoDB ํ
์ด๋ธ์ ๊ฒฝ์ฐ ์คํ ๋ฆฌ์ง ์์ง ์ฐจ์์์ ๋ ์ฝ๋ ๊ธฐ๋ฐ์ ์ ๊ธ์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์
๋จ์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ฟผ๋ฆฌ๋ก ์ธํด ๋ฌต์์ ์ธ ํ ์ด๋ธ ๋ฝ์ด ์ค์ ๋์ง ์์
(InnoDB ํ ์ด๋ธ์๋ ํ ์ด๋ธ ๋ฝ์ด ์ค์ ๋์ง๋ง
๋๋ถ๋ถ์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ(DML) ์ฟผ๋ฆฌ์์๋ ๋ฌด์๋๊ณ ์คํค๋ง๋ฅผ ๋ณ๊ฒฌํ๋ ์ฟผ๋ฆฌ(DDL)์ ๊ฒฝ์ฐ์๋ง ์ํฅ์ ๋ฏธ์นจ)
2.3 ๋ค์๋ ๋ฝ(Named Lock)
๋ค์๋๋ฝ ํจ์
1
GET_LOCK()
- ์ฌ์ฉ์์ ํ์์ ๋ง๊ฒ ์ฌ์ฉํ ์ ์๋ ๋ฝ
- ์์์ ๋ฌธ์์ด์ ๋ํด ์ ๊ธ์ ์ค์ ํ ์ ์์
- ๋จ์ํ ์ฌ์ฉ์๊ฐ ์ง์ ํ ๋ฌธ์์ด(String)์ ๋ํด ํ๋ํ๊ณ ๋ฐ๋ฉ(ํด์ )ํ๋ ์ ๊ธ
- ๋ค์๋ ๋ฝ์ ์์ฃผ ์ฌ์ฉ๋์ง๋ ์์
- ์ฌ์ฉ
- ๋ ์ฝ๋์ ๋ํด์ ๋ณต์กํ ์๊ฑด์ผ๋ก ๋ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๋ ํธ๋์ญ์ ์ ์ ์ฉํ๊ฒ ์ฌ์ฉ
- ์ฌ๋ฌ ํด๋ผ์ด์ธํธ๊ฐ ์ํธ ๋๊ธฐํ๋ฅผ ์ฒ๋ฆฌํด์ผ ํ ๋
(๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ฒ 1๋์ 5๋์ ์น ์๋ฒ๊ฐ ์ ์ํด์ ์๋น์คํ๋ ์ํฉ์์
5๋์ ์น ์๋ฒ๊ฐ ์ด๋ค ์ ๋ณด๋ฅผ ๋๊ธฐํํด์ผ ํ๋ ์๊ฑด)
โ๏ธ MySQL 8.0 ๋ฒ์
- ๋ค์๋ ๋ฝ์ ์ค์ฒฉํด์ ์ฌ์ฉ ๊ฐ๋ฅ
- ์ธ์ ์์ ํ๋ํ ๋ค์๋ ๋ฝ์ ํ ๋ฒ์ ๋ชจ๋ ํด์ ํ๋ ๊ธฐ๋ฅ๋ ์ถ๊ฐ
2.4 ๋ฉํ๋ฐ์ดํฐ ๋ฝ(Metadata Lock)์
- ํ ์ด๋ธ์ ๊ตฌ์กฐ๋ฅผ ์ ๊ทธ๋ ๋ฝ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ฒด(๋ํ์ ์ผ๋ก ํ ์ด๋ธ์ด๋ ๋ทฐ ๋ฑ)์ ์ด๋ฆ์ด๋ ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒฝ์ฐ์ ํ๋ํ๋ ์ ๊ธ
- ๋ช ์์ ์ผ๋ก ํ๋ํ๊ฑฐ๋ ํด์ ํ ์ ์๋ ๊ฒ์ด ์๋๊ณ ํ ์ด๋ธ์ ์ด๋ฆ์ ๋ณ๊ฒฝํ๋ ๊ฒฝ์ฐ ์๋์ผ๋ก ํ๋ํ๋ ์ ๊ธ
- RENAME TABLE ๋ช ๋ น์ ๊ฒฝ์ฐ ์๋ณธ ์ด๋ฆ๊ณผ ๋ณ๊ฒฝ๋ ์ด๋ฆ ๋ ๊ฐ ๋ชจ๋ ํ๊บผ๋ฒ์ ์ ๊ธ์ ์ค์
3 InnoDB ์คํ ๋ฆฌ์ง ์์ง ์ ๊ธ
- MySQL์์ ์ ๊ณตํ๋ ์ ๊ธ๊ณผ๋ ๋ณ๊ฐ๋ก ์คํ ๋ฆฌ์ง ์์ง ๋ด๋ถ์์ ๋ ์ฝ๋ ๊ธฐ๋ฐ์ ์ ๊ธ ๋ฐฉ์์ ํ์ฌ
- ๋ ์ฝ๋ ๊ธฐ๋ฐ์ ์ ๊ธ ๋ฐฉ์์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ MyISAM๋ณด๋ค๋ ํจ์ฌ ๋ฐ์ด๋ ๋์์ฑ ์ฒ๋ฆฌ๋ฅผ ์ ๊ณต
- ํ์ง๋ง ์ด์ํ๋ ์ ๊ธ ์ฒ๋ฆฌ ํ์
InnoDB ์คํ ๋ฆฌ์ง ์์ง์์ ์ฌ์ฉ๋๋ ์ ๊ธ์ ๋ํ ์ ๋ณด๋
MySQL ๋ช ๋ น์ ์ด์ฉํด ์ ๊ทผํ๊ธฐ๊ฐ ์๋นํ ๊น๋ค๋ก์
3.1 InnoDB ์คํ ๋ฆฌ์ง ์์ง์ ์ ๊ธ
- ๋ ์ฝ๋ ๊ธฐ๋ฐ์ ์ ๊ธ ๊ธฐ๋ฅ์ ์ ๊ณต
- ์ผ๋ฐ ์์ฉ DBMS์๋ ์กฐ๊ธ ๋ค๋ฅด๊ฒ InnoDB ์คํ ๋ฆฌ์ง ์์ง์์๋
๋ ์ฝ๋์ ๋ ์ฝ๋ ์ฌ์ด์ ๊ฐ๊ฒฉ์ ์ ๊ทธ๋ ๊ฐญ(GAP) ๋ฝ์ด๋ผ๋ ๊ฒ์ด ์กด์ฌ
3.1.1 ๋ ์ฝ๋ ๋ฝ(Record lock, Record only lock)
- ๋ ์ฝ๋ ์์ฒด๋ง์ ์ ๊ทธ๋ ๊ฒ
- ๋ค๋ฅธ ์์ฉ DBMS์ ๋ ์ฝ๋ ๋ฝ๊ณผ ๋์ผํ ์ญํ ์ ํ์ง๋ง
InnoDB ์คํ ๋ฆฌ์ง ์์ง์ ๋ ์ฝ๋ ์์ฒด๊ฐ ์๋๋ผ ์ธ๋ฑ์ค์ ๋ ์ฝ๋๋ฅผ ์ ๊ทผ๋ค๋ ์ฐจ์ด๋ฅผ ๊ฐ์ง
3.1.2 ๊ฐญ ๋ฝ
- ์ฝ๋ ์์ฒด๊ฐ ์๋๋ผ ๋ ์ฝ๋์ ๋ฐ๋ก ์ธ์ ํ ๋ ์ฝ๋ ์ฌ์ด์ ๊ฐ๊ฒฉ๋ง์ ์ ๊ทธ๋ ๊ฒ
- ์ฝ๋์ ๋ ์ฝ๋ ์ฌ์ด์ ๊ฐ๊ฒฉ์ ์๋ก์ด ๋ ์ฝ๋๊ฐ ์์ฑ(INSERT)๋๋ ๊ฒ์ ์ ์ด
3.1.3 ๋ฅ์คํธ ํค ๋ฝ
- ๋ ์ฝ๋ ๋ฝ๊ณผ ๊ฐญ ๋ฝ์ ํฉ์ณ ๋์ ํํ
- InnoDB์ ๊ฐญ ๋ฝ์ด๋ ๋ฅ์คํธ ํค ๋ฝ์
๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ์ ๊ธฐ๋ก๋๋ ์ฟผ๋ฆฌ๊ฐ ๋ ํ๋ฆฌ์นด ์๋ฒ์์ ์คํ๋ ๋
์์ค ์๋ฒ์์ ๋ง๋ค์ด ๋ธ ๊ฒฐ๊ณผ์ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ง๋ค์ด๋ด๋๋ก ๋ณด์ฅํ๋ ๊ฒ์ด ์ฃผ ๋ชฉ์ - But ์์ธ๋ก ๋ฅ์คํธ ํค ๋ฝ๊ณผ ๊ฐญ ๋ฝ์ผ๋ก ์ธํด ๋ฐ๋๋ฝ์ด ๋ฐ์ํ๊ฑฐ๋
๋ค๋ฅธ ํธ๋์ญ์ ์ ๊ธฐ๋ค๋ฆฌ๊ฒ ๋ง๋๋ ์ผ์ด ์์ฃผ ๋ฐ์
(๊ฐ๋ฅํ๋ค๋ฉด ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ ํฌ๋งท์ ROW ํํ๋ก ๋ฐ๊ฟ์ ๋ฅ์คํธ ํค ๋ฝ์ด๋ ๊ฐญ ๋ฝ์ ์ค์ด๋ ๊ฒ์ด ์ข์)
3.1.4 ์๋ ์ฆ๊ฐ ๋ฝ
MySQL์์๋ ์๋ ์ฆ๊ฐํ๋ ์ซ์ ๊ฐ์ ์ถ์ถ(์ฑ๋ฒ)ํ๊ธฐ ์ํด
AUTO_INCREMENT๋ผ๋ ์นผ๋ผ ์์ฑ์ ์ ๊ณตํ๋ค.
AUTO_INCREMENT ์นผ๋ผ์ด ์ฌ์ฉ๋ ํ
์ด๋ธ์ ๋์์ ์ฌ๋ฌ ๋ ์ฝ๋๊ฐ INSERT๋๋ ๊ฒฝ์ฐ,
์ ์ฅ๋๋ ๊ฐ ๋ ์ฝ๋๋ ์ค๋ณต๋์ง ์๊ณ ์ ์ฅ๋ ์์๋๋ก ์ฆ๊ฐํ๋ ์ผ๋ จ๋ฒํธ ๊ฐ์ ๊ฐ์ ธ์ผ ํ๋ค.
InnoDB ์คํ ๋ฆฌ์ง ์์ง์ ์๋ ์ด๋ฅผ ์ํด ๋ด๋ถ์ ์ผ๋ก AUTO_INCREMENT ๋ฝ(Auto increment lock)์ด๋ผ๊ณ ํ๋ ํ ์ด๋ธ ์์ค์ ์ ๊ธ์ ์ฌ์ฉํ๋ค.
- INSERT์ REPLACE ์ฟผ๋ฆฌ ๋ฌธ์ฅ๊ณผ ๊ฐ์ด ์๋ก์ด ๋ ์ฝ๋๋ฅผ ์ ์ฅํ๋ ์ฟผ๋ฆฌ์์๋ง ํ์
- UPDATE๋ DELETE ๋ฑ์ ์ฟผ๋ฆฌ์์๋ ๊ฑธ๋ฆฌ์ง ์์
- ๋ค๋ฆ ์ ๊ธ๋ค๊ณผ ๋ค๋ฅด๊ฒ ํธ๋์ญ์
๊ณผ ๊ด๊ณ์์ด
INSERT๋ REPLACE ๋ฌธ์ฅ์์ AUTO_INCREMENT ๊ฐ์ ๊ฐ์ ธ์ค๋ ์๊ฐ๋ง ๋ฝ์ด ๊ฑธ๋ ธ๋ค๊ฐ ์ฆ์ ํด์
3.2 ์ธ๋ฑ์ค์ ์ ๊ธ
- InnoDB์ ์ ๊ธ์
๋ ์ฝ๋๋ฅผ ์ ๊ทธ๋ ๊ฒ์ด ์๋๋ผ
์ธ๋ฑ์ค๋ฅผ ์ ๊ทธ๋ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌ
(๋ณ๊ฒฝํด์ผ ํ ๋ ์ฝ๋๋ฅผ ์ฐพ๊ธฐ ์ํด ๊ฒ์ํ ์ธ๋ฑ์ค์ ๋ ์ฝ๋๋ฅผ ๋ชจ๋ ๋ฝ์ ๊ฑธ์ด์ผ ํจ)
์์
1
2
3
4
mysql>
UPDATE employees SET hire_date=NOW()
WHERE first_name='Georgi'
AND last_name='Klassen';
employees ํ
์ด๋ธ์์
first_name=โGeorgiโ์ด๊ณ
last_name=โKlassenโ์ธ ์ฌ์์
์
์ฌ ์ผ์๋ฅผ ์ค๋๋ก ๋ณ๊ฒฝํ๋ ์ฟผ๋ฆฌ๋ฅผ ์คํํ์ ๊ฒฝ์ฐ
โก๏ธ first_name์ธ employee๊ฐ 200๋ช
์ด ๊ฒฝ์ฐ
โfirst_name=โGeorgiโ์ธ 200๊ฑด์ ๋ ์ฝ๋๊ฐ ๋ชจ๋ ์ ๊ธฐ๊ฒ ๋๋ค.
๋ง์ฝ ์กฐ์ง์ ๊ท๋ชจ๊ฐ ์ปค์ โfirst_name=โGeorgiโ์ธ employee๊ฐ ๋๋ฌด ๋ง๋ค๋ฉด
๊ฐ ํด๋ผ์ด์ธํธ ๊ฐ์ ๋์์ฑ์ด ์๋นํ ๋จ์ด์ ธ์
ํ ์ธ์
์์ UPDATE ์์
์ ํ๋ ์ค์๋
๋ค๋ฅธ ํด๋ผ์ด์ธํธ๋ ๊ทธ ํ
์ด๋ธ์ ์
๋ฐ์ดํธํ์ง ๋ชปํ๊ณ ๊ธฐ๋ค๋ ค์ผ ํ๋ ์ํฉ์ด ๋ฐ์ํ ์ ์๋ค.
๋ง์ฝ ์ด ํ
์ด๋ธ์ ์ธ๋ฑ์ค๊ฐ ํ๋๋ ์๋ค๋ฉด
ํ
์ด๋ธ์ ํ ์ค์บํ๋ฉด์ UPDATE ์์
์ ํ๊ฒ๋๋ค.
์ด ๊ณผ์ ์์ ํ
์ด๋ธ์ ์๋ ๋ชจ๋ ๋ ์ฝ๋๋ฅผ ์ ๊ทธ๊ฒ ๋๋ค.
์ด๊ฒ์ด MySQL์ ๋ฐฉ์์ด๋ฉฐ, MySQL์ InnoDB์์ ์ธ๋ฑ์ค ์ค๊ณ๊ฐ ์ค์ํ ์ด์ ๋ํ ์ด ๋๋ฌธ์ด๋ค.
์ธ๋ฑ์ค๊ฐ ์๊ธฐ ๋๋ฌธ์ ํ์ค์บํ์ง ์๊ณ UPDATE ํ ์ ์์
3.3 ๋ ์ฝ๋ ์์ค์ ์ ๊ธ ํ์ธ ๋ฐ ํด์
ํ ์ด๋ธ ์ ๊ธ์์๋ ์ ๊ธ์ ๋์์ด ํ ์ด๋ธ ์์ฒด์ด๋ฏ๋ก ์ฝ๊ฒ ๋ฌธ์ ์ ์์ธ์ด ๋ฐ๊ฒฌ๋๊ณ ํด๊ฒฐ๋ ์ ์๋ค.
ํ์ง๋ง InnoDB ์คํ ๋ฆฌ์ง ์์ง์ ์ฌ์ฉํ๋ ํ
์ด๋ธ์ ๋ ์ฝ๋ ์์ค ์ ๊ธ์
ํ
์ด๋ธ์ ๋ ์ฝ๋ ๊ฐ๊ฐ์ ์ ๊ธ์ด ๊ฑธ๋ฆฌ๋ฏ๋ก ๊ทธ ๋ ์ฝ๋๊ฐ ์์ฃผ ์ฌ์ฉ๋์ง ์๋๋ค๋ฉด
์ค๋ ์๊ฐ ๋์ ์ ๊ฒจ์ง ์ํ๋ก ๋จ์ ์์ด๋ ์ ๋ฐ๊ฒฌ๋์ง ์๋๋ค.
MySQL 5.1๋ถํฐ๋ ๋ ์ฝ๋ ์ ๊ธ๊ณผ ์ ๊ธ ๋๊ธฐ์ ๋ํ ์กฐํ๊ฐ ๊ฐ๋ฅํด์ ธ
์ฟผ๋ฆฌ ํ๋๋ง ์คํํด ๋ณด๋ฉด ์ ๊ธ๊ณผ ์ ๊ธ ๋๊ธฐ๋ฅผ ๋ฐ๋ก ํ์ธ ๊ฐ๋ฅํ๋ค.
- ๊ธฐ์กด์ mysql
- ๊ฐ ํธ๋์ญ์ ์ด ์ด๋ค ์ ๊ธ์ ๊ธฐ๋ค๋ฆฌ๊ณ ์๋์ง,
๊ธฐ๋ค๋ฆฌ๊ณ ์๋ ์ ๊ธ์ ์ด๋ค ํธ๋์ญ์ ์ด ๊ฐ์ง๊ณ ์๋์ง๋ฅผ
์ฝ๊ฒ ๋ฉํ ์ ๋ณด๋ฅผ ํตํด ์กฐํ ๊ฐ๋ฅ
- MySQL 5.1๋ถํฐ
- information_schema๋ผ๋ DB์
INNODB_TRX๋ผ๋ ํ ์ด๋ธ๊ณผ INNODB_LOCKS, INNODB_LOCK_WAITS๋ผ๋ ํ ์ด๋ธ์ ํตํด ํ์ธ์ด ๊ฐ๋ฅ
- MySQL 8.0 ๋ฒ์ ๋ถํฐ
- information_schema์ ์ ๋ณด๋ค์ ์กฐ๊ธ์ฉ ์ ๊ฑฐ(Deprecated)๋๊ณ ์์ผ๋ฉฐ, ๊ทธ ๋์ performance_schema์ data_locks์ data_lock_waits ํ ์ด๋ธ๋ก ๋์ฒด
performance_schema์ ํ ์ด๋ธ์ ์ด์ฉํด ์ ๊ธ๊ณผ ์ ๊ธ ๋๊ธฐ ์์๋ฅผ ํ์ธํ๋ ๋ฐฉ๋ฒ
(์์)
1
2
3
4
5
6
7
8
mysql> SHOW PROCESSLIST;
+----+--------+----------+-----------------------------------------------------------+
| Id | Time | State | Info |
+----+--------+----------+-----------------------------------------------------------+
| 17 | 607 | | NULL |
| 18 | 22 | updating | UPDATE employees SET birth_date=NOW() WHERE emp_no=100001 |
| 19 | 21 | updating | UPDATE employees SET birth_date=NOW() WHERE emp_no=100001 |
+----+--------+----------+-----------------------------------------------------------+
- 17๋ฒ ์ค๋ ๋
- ์ง๊ธ ์๋ฌด๊ฒ๋ ํ์ง ์๊ณ ์์
- ํธ๋์ญ์ ์ ์์ํ๊ณ UPDATE ๋ช ๋ น์ด ์คํ ์๋ฃ๋ ์ํ
- But ์์ง 17๋ฒ ์ค๋ ๋๋ COMMIT์ ์คํํ์ง๋ ์์ ์ํ๋ก ์ ๋ฐ์ดํธํ ๋ ์ฝ๋์ ์ ๊ธ์ ๊ทธ๋๋ก ๊ฐ์ง๊ณ ์๋ ์ํ
- 18๋ฒ ์ค๋ ๋๊ฐ ๊ทธ๋ค์์ผ๋ก UPDATE ๋ช
๋ น์ ์คํ
- ์ ๊ธ ๋๊ธฐ๋ก ์ธํด ์์ง UPDATE ๋ช ๋ น์ ์คํ ์ค์ธ ๊ฒ์ผ๋ก ํ์
- 19๋ฒ ์ค๋ ๋๊ฐ ๊ทธ๋ค์์ผ๋ก UPDATE ๋ช
๋ น์ ์คํ
- ์ ๊ธ ๋๊ธฐ๋ก ์ธํด ์์ง UPDATE ๋ช ๋ น์ ์คํ ์ค์ธ ๊ฒ์ผ๋ก ํ์
(์์)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mysql> SELECT
r.trx_id waiting_trx_id,
r.trx_mysql_thread_id waiting_thread,
r.trx_query waiting_query,
b.trx_id blocking_trx_id,
b.trx_mysql_thread_id blocking_thread,
b.trx_query blocking_query
FROM performance_schema.data_lock_waits w
INNER JOIN information_schema.innodb_trx b
ON b.trx_id = w.blocking_engine_transaction_id
INNER JOIN information_schema.innodb_trx r
ON r.trx_id = w.requesting_engine_transaction_id;
+---------+---------+-------------------+----------+----------+-------------------+
| waiting | waiting | waiting_query | blocking | blocking | blocking_query |
| _trx_id | _thread | | _trx_id | _thread | |
+---------+---------+-------------------+----------+----------+-------------------+
| 11990 | 19 | UPDATE employees..| 11989 | 18 | UPDATE employees..|
| 11990 | 19 | UPDATE employees..| 11984 | 17 | NULL |
| 11989 | 18 | UPDATE employees..| 11984 | 17 | NULL |
+---------+---------+-------------------+----------+----------+-------------------+
17๋ฒ ์ค๋ ๋๊ฐ
๊ฐ์ง๊ณ ์๋ ์ ๊ธ์ ํด์ ํ๊ณ ,
18๋ฒ ์ค๋ ๋๊ฐ
๊ทธ ์ ๊ธ์ ํ๋ํ๊ณ ,
UPDATE๋ฅผ ์๋ฃํ ํ,
์ ๊ธ์ ํ์ด์ผ
19๋ฒ ์ค๋ ๋๊ฐ
UPDATE๋ฅผ ์คํํ ์ ์์์ ์๋ฏธ
- waiting _thread
:ํ์ฌ ์ด๋ค ์ค๋ ๋๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์๋์ง ์๋ ค์ค
17๋ฒ ์ค๋ ๋๊ฐ ์ด๋ค ์ ๊ธ์ ๊ฐ์ง๊ณ ์๋์ง ๋ ์์ธํ ํ์ธํ๊ณ ์ถ๋ค๋ฉด
๋ค์๊ณผ ๊ฐ์ด performance_schema์
data_locks ํ
์ด๋ธ์ด ๊ฐ์ง ์นผ๋ผ์ ๋ชจ๋ ์ดํด๋ณด๋ฉด ๋๋ค.
1
2
LOCK_TYPE: TABLE
LOCK_MODE: IX
ํด๋น ํ ์ด๋ธ์ ๋ํด IX ์ ๊ธ(Intentional Exclusive)์ ๊ฐ์ง๊ณ ์์
1
2
LOCK_TYPE: RECORD
LOCK_MODE: X,REC_NOT_GAP
- ํด๋น ํ ์ด๋ธ์ ํน์ ๋ ์ฝ๋์ ๋ํด์ ์ฐ๊ธฐ ์ ๊ธ์ ๊ฐ์ง๊ณ ์์
- REC_NOT_GAP ํ์๊ฐ ์์ผ๋ฏ๋ก
๋ ์ฝ๋ ์ ๊ธ์ ๊ฐญ์ด ํฌํจ๋์ง ์์ ์์ ๋ ์ฝ๋์ ๋ํด์๋ง ์ ๊ธ์ ๊ฐ์ง๊ณ ์์
๊ฐ์ ์ข ๋ฃ ๋ช ๋ น์ด
1
2
mysql>
KILL <์ค๋ ๋ ๋ฒํธ>;
4 MySQL์ ๊ฒฉ๋ฆฌ ์์ค
- ํธ๋์ญ์ ์ ๊ฒฉ๋ฆฌ ์์ค(isolation level)
- ์ฌ๋ฌ ํธ๋์ญ์
์ด ๋์์ ์ฒ๋ฆฌ๋ ๋
ํน์ ํธ๋์ญ์ ์ด ๋ค๋ฅธ ํธ๋์ญ์ ์์ ๋ณ๊ฒฝํ๊ฑฐ๋ ์กฐํํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ณผ ์ ์๊ฒ
ํ์ฉํ ์ง ๋ง์ง๋ฅผ ๊ฒฐ์ ํ๋ ๊ฒ
ย | DIRTY READ | NON-REPEATABLE | PHANTOM READ |
---|---|---|---|
READ UNCOMMITTED | ๋ฐ์ | ๋ฐ์ | ๋ฐ์ |
READ COMMITTED | ์์ | ๋ฐ์ | ๋ฐ์ |
REPEATABLE READ | ์์ | ์์ | ๋ฐ์ (InnoDB๋ ์์) |
SERIALIZABLE | ์์ | ์์ | ์์ |
SQL-92 ๋๋ SQL-99 ํ์ค์ ๋ฐ๋ฅด๋ฉด
REPEATABLE READ ๊ฒฉ๋ฆฌ ์์ค์์๋
PHANTOM READ๊ฐ ๋ฐ์ํ ์ ์์ง๋ง,
InnoDB์์๋ ๋ ํนํ ํน์ฑ ๋๋ฌธ์
REPEATABLE READ ๊ฒฉ๋ฆฌ ์์ค์์๋
PHANTOM READ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
์ฌ์ฉ
- ์ผ๋ฐ์ ์ธ ์จ๋ผ์ธ ์๋น์ค ์ฉ๋์ ๋ฐ์ดํฐ๋ฒ ์ด์ค
- ์ฃผ๋ก READ COMMITTED์ REPEATABLE READ ์ค ํ๋๋ฅผ ์ฌ์ฉ
- ์ค๋ผํด ๊ฐ์ DBMS
- ์ฃผ๋ก READ COMMITTED ์์ค์ ์ฌ์ฉ
- MySQL
- ์ฃผ๋ก REPEATABLE READ ์์ค์ ์ฌ์ฉ
4.1 READ UNCOMMITTED(DIRTY READ)
- ์ผ๋ฐ์ ์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์๋ ๊ฑฐ์ ์ฌ์ฉํ์ง ์์
ํธ๋์ญ์
์์์ ๋ณ๊ฒฝ ๋ด์ฉ์ด
COMMIT์ด๋ ROLLBACK ์ฌ๋ถ์ ์๊ด์์ด ๋ค๋ฅธ ํธ๋์ญ์
์์ ๋ณด์.
- RDBMS ํ์ค์์๋
ํธ๋์ญ์ ์ ๊ฒฉ๋ฆฌ ์์ค์ผ๋ก ์ธ์ ํ์ง ์์ ์ ๋๋ก ์ ํฉ์ฑ์ ๋ฌธ์ ๊ฐ ๋ง์ ๊ฒฉ๋ฆฌ ์์ค
(MySQL์ ์ฌ์ฉํ๋ค๋ฉด ์ต์ํ READ COMMITTED ์ด์์ ๊ฒฉ๋ฆฌ ์์ค์ ์ฌ์ฉํ ๊ฒ์ ๊ถ์ฅ)
- ๋ํฐ ๋ฆฌ๋(Dirty read)
- ์ด๋ค ํธ๋์ญ์ ์์ ์ฒ๋ฆฌํ ์์ ์ด ์๋ฃ๋์ง ์์๋๋ฐ๋ ๋ค๋ฅธ ํธ๋์ญ์ ์์ ๋ณผ ์ ์๋ ํ์
- ๋ฐ์ดํฐ๊ฐ ๋ํ๋ฌ๋ค๊ฐ ์ฌ๋ผ์ก๋ค ํ๋ ํ์์ ์ด๋ํ๋ฏ๋ก
์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์์ ์ฌ์ฉ์๋ฅผ ์๋นํ ํผ๋์ค๋ฝ๊ฒ ๋ง๋ฆ
๋ฐ์ดํฐ ์ ํฉ์ฑ
- ๋ฐ์ดํฐ๊ฐ ์๋ก ๋ชจ์ ์์ด ์ผ๊ด๋๊ฒ ์ผ์นํด์ผ ํจ
- ์ค๋ณต ๋ฐ์ดํฐ๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ๋ผ๋ฆฌ ์ ํฉ์ฑ์ ๋ง์ถ๊ธฐ ์ด๋ ค์
- ๋น์ ๊ทํ์ ์ฌ์ฉํด ์๋ ธ๋ง๋ฆฌ (anomaly : ์ด์ํ์)๊ฐ ๋ฐ์ํ๋ฉด ์ ํฉ์ฑ์ด ๊นจ์ง
(์ ํฉ์ฑ ํผ์์ ์์) โ์ ์ ๋ง์ จ์ง๋ง, ์์ฃผ์ด์ ์ ํ์ง ์์๋ค.โ
4.2 READ COMMITTED
์ด๋ค ํธ๋์ญ์
์์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋๋ผ๋
COMMIT์ด ์๋ฃ๋ ๋ฐ์ดํฐ๋ง ๋ค๋ฅธ ํธ๋์ญ์
์์ ์กฐํํ ์ ์์.
- ์ค๋ผํด DBMS์์ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉ๋๋ ๊ฒฉ๋ฆฌ ์์ค
- ์จ๋ผ์ธ ์๋น์ค์์ ๊ฐ์ฅ ๋ง์ด ์ ํ๋๋ ๊ฒฉ๋ฆฌ ์์ค
- ๋ํฐ ๋ฆฌ๋(Dirty read) ๊ฐ์ ํ์์ ๋ฐ์ํ์ง ์์
- ์ด๋ค ํธ๋์ญ์
์์ ๋ณ๊ฒฝํ ๋ด์ฉ์ด ์ปค๋ฐ๋์ง ์ ๊น์ง๋
๋ค๋ฅธ ํธ๋์ญ์ ์์ ๊ทธ๋ฌํ ๋ณ๊ฒฝ ๋ด์ญ์ ์กฐํํ ์ ์๊ธฐ ๋๋ฌธ์
์ธ๋ ์์ญ์ ๋ฐฑ์ ๋ ๋ ์ฝ๋๋ฅผ ๊ฐ์ ธ์ ๋ณด์ฌ์ค
(์ปค๋ฐํ๋ฉด ๊ทธ๋๋ถํฐ๋ ๋ค๋ฅธ ํธ๋์ญ์ ์์๋ ์๋ก ๋ณ๊ฒฝ๋ ๊ฐ์ ์ฐธ๊ณ ํ ์ ์๊ฒ ๋จ)
- NON-REPEATABLE READ (๋ถ์ ํฉ์ ๋ฌธ์ )
- REPEATABLE READ๊ฐ ๋ณด์ฅ๋์ง ์๊ธฐ ๋๋ฌธ์
SELECT ์ฟผ๋ฆฌ๊ฐ ์คํ๋ ๋๋ง๋ค ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฌธ์ ๋ฐ์
- REPEATABLE READ๊ฐ ๋ณด์ฅ๋์ง ์๊ธฐ ๋๋ฌธ์
ํธ๋์ญ์ ๋ด์์ ์คํ๋๋ SELECT๋ฌธ / ํธ๋์ญ์ ์์ด ์คํ๋๋ SELECT๋ฌธ
READ COMMITTED ๊ฒฉ๋ฆฌ ์์ค
- ํธ๋์ญ์
๋ด์์ ์คํ๋๋ SELECT ๋ฌธ์ฅ๊ณผ
ํธ๋์ญ์ ์ธ๋ถ์์ ์คํ๋๋ SELECT ๋ฌธ์ฅ์
์ฐจ์ด๊ฐ ๋ณ๋ก ์๋ค.
REPEATABLE READ ๊ฒฉ๋ฆฌ ์์ค
- ๊ธฐ๋ณธ์ ์ผ๋ก SELECT ์ฟผ๋ฆฌ ๋ฌธ์ฅ๋ ํธ๋์ญ์
๋ฒ์ ๋ด์์๋ง ์๋
(START TRANSACTION(๋๋ BEGIN) ๋ช ๋ น์ผ๋ก
ํธ๋์ญ์ ์ ์์ํ ์ํ์์ ์จ์ข ์ผ ๋์ผํ ์ฟผ๋ฆฌ๋ฅผ ๋ฐ๋ณตํด์ ์คํํด๋ ๋์ผํ ๊ฒฐ๊ณผ๊ฐ ๋ํ๋จ
(๋ค๋ฅธ ํธ๋์ญ์ ์์ ๊ทธ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๊ณ COMMIT์ ์คํํ์ ๋๋ ๋์ผ))
4.3 REPEATABLE READ
- MySQL์ InnoDB ์คํ ๋ฆฌ์ง ์์ง์์ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉ๋๋ ๊ฒฉ๋ฆฌ ์์ค
- ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ๋ฅผ ๊ฐ์ง MySQL ์๋ฒ์์๋
์ต์ REPEATABLE READ ๊ฒฉ๋ฆฌ ์์ค ์ด์์ ์ฌ์ฉํด์ผ ํจ - โNON-REPEATABLE READโ ๋ถ์ ํฉ์ด ๋ฐ์ํ์ง ์์
- MVCC๋ฅผ ์ํด
์ธ๋ ์์ญ์ ๋ฐฑ์ ๋ ์ด์ ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํด
๋์ผ ํธ๋์ญ์ ๋ด์์๋ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ค ์ ์๊ฒ ๋ณด์ฅ - REPEATABLE READ์ READ COMMITTED ๋ชจ๋
MVCC๋ฅผ ์ด์ฉํด COMMIT๋๊ธฐ ์ ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ฌ์ฃผ๊ณ ,
์ธ๋ ์์ญ์ ๋ฐฑ์ ๋ ๋ ์ฝ๋์ ๋ฒ์ ์ฐจ์ด๊ฐ ์๋ค.
MVCC(Multi Version Concurrency Control) ๋ณ๊ฒฝ๋ฐฉ์ :
InnoDB ์คํ ๋ฆฌ์ง ์์ง์ ํธ๋์ญ์ ์ด ROLLBACK๋ ๊ฐ๋ฅ์ฑ์ ๋๋นํด ๋ณ๊ฒฝ๋๊ธฐ
์ ๋ ์ฝ๋๋ฅผ ์ธ๋(Undo) ๊ณต๊ฐ์ ๋ฐฑ์ ํด๋๊ณ ์ค์ ๋ ์ฝ๋ ๊ฐ์ ๋ณ๊ฒฝ
InnoDB์ ํธ๋์ญ์
- ๊ณ ์ ํ ํธ๋์ญ์ ๋ฒํธ(์์ฐจ์ ์ผ๋ก ์ฆ๊ฐํ๋ ๊ฐ)๋ฅผ ๊ฐ์ง
- ์ธ๋ ์์ญ์ ๋ฐฑ์ ๋ ๋ชจ๋ ๋ ์ฝ๋์๋ ๋ณ๊ฒฝ์ ๋ฐ์์ํจ ํธ๋์ญ์ ์ ๋ฒํธ ํฌํจ
- ์ธ๋ ์์ญ์ ๋ฐฑ์
๋ ๋ฐ์ดํฐ๋
InnoDB ์คํ ๋ฆฌ์ง ์์ง์ด ๋ถํ์ํ๋ค๊ณ ํ๋จํ๋ ์์ ์ ์ฃผ๊ธฐ์ ์ผ๋ก ์ญ์
ํ๋์ ๋ ์ฝ๋์ ๋ํด ๋ฐฑ์
์ด ํ๋ ์ด์ ์ผ๋ง๋ ์ง ์กด์ฌํ ์ ์๋ค.
ํ ์ฌ์ฉ์๊ฐ BEGIN์ผ๋ก ํธ๋์ญ์
์ ์์ํ๊ณ
์ฅ์๊ฐ ํธ๋์ญ์
์ ์ข
๋ฃํ์ง ์์ผ๋ฉด
์ธ๋ ์์ญ์ด ๋ฐฑ์
๋ ๋ฐ์ดํฐ๋ก ๋ฌดํ์ ์ปค์ง ์๋ ์๋ค.
์ด๋ ๊ฒ ์ธ๋์ ๋ฐฑ์
๋ ๋ ์ฝ๋๊ฐ ๋ง์์ง๋ฉด MySQL ์๋ฒ์ ์ฒ๋ฆฌ ์ฑ๋ฅ์ด ๋จ์ด์ง ์ ์๋ค.
๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ
- MySQL ์๋ฒ ์ธ์คํด์ค์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ฌํญ๋ค์ ๋ํ ์ ๋ณด๋ฅผ ํฌํจํ๋ ๋ก๊ทธ ํ์ผ์ ์ธํธ
- ์๋ฌ์ฝ๋, ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ ์์ฒด์ ๋ํ ๋ฉํ๋ฐ์ดํฐ ๋ฑ ๋ค์ํ ๋ฐ์ดํฐ๊ฐ ๊ฐ์ด ํฌํจ
- ๊ธฐ๋ณธ์ ์ผ๋ก Transaction Commit ์์ ๊ธฐ๋ก๋์ด์ง๋ฉฐ, ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์์๋ฅผ ๋ณด์ฅ
4.4 SERIALIZABLE
- ๋์์ฑ์ด ์ค์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์๋ ๊ฑฐ์ ์ฌ์ฉ๋์ง ์์
- ๊ฐ์ฅ ๋จ์ํ ๊ฒฉ๋ฆฌ ์์ค์ด๋ฉด์ ๋์์ ๊ฐ์ฅ ์๊ฒฉํ ๊ฒฉ๋ฆฌ ์์ค
- ๋์ ์ฒ๋ฆฌ ์ฑ๋ฅ๋ ๋ค๋ฅธ ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค๋ณด๋ค ๋จ์ด์ง
- ์ฝ๊ธฐ ์์
๋ ๊ณต์ ์ ๊ธ(์ฝ๊ธฐ ์ ๊ธ)์ ํ๋ํด์ผ๋ง ํ๋ฉฐ,
๋์์ ๋ค๋ฅธ ํธ๋์ญ์ ์ ๊ทธ๋ฌํ ๋ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง ๋ชปํจ
( ํ ํธ๋์ญ์ ์์ ์ฝ๊ณ ์ฐ๋ ๋ ์ฝ๋๋ฅผ ๋ค๋ฅธ ํธ๋์ญ์ ์์๋ ์ ๋ ์ ๊ทผํ ์ ์์) - ์ผ๋ฐ์ ์ธ DBMS์์ ์ผ์ด๋๋ โPHANTOM READโ๋ฌธ์ ๋ฐ์ํ์ง ์์
โ
(์ฐธ๊ณ )
๊ณต๋ถํ ๋ด์ฉ์ ์ฌ๋ฌ๊ธ๊ณผ ์ฑ
์ฝ์ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ์ ๋ฆฌํ๊ณ ์์ต๋๋ค.
์ข์ ๊ธ๋ก ์ ์ ๊ณต๋ถ์ ๋์์ ์ฃผ์๋ ๋ถ๋ค๊ป ๊ฐ์ฌ๋๋ฆฝ๋๋ค.