๐ ๊ต์ฐฉ ์ํ๋ฅผ ์๋์ผ๋ก ์คํํ์! [SQL]
๐ ๊ต์ฐฉ์ํ๋?
์ด๊ฒ์ ์ฌ๋ฌ ์ฌ์ฉ์๊ฐ ๊ฐ ์ ๊ธ ํด์ ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์๊ตฌ ์ ๊ธ์ด ํด์ ๋์ง ์๋ ์ํฉ์ ๋๋ค.
๐ ๊ต์ฐฉ์ํ๋ฅผ ํด๋ณด์
1๏ธโฃ ์ด ํ ์ด๋ธ ๋ง๋ค๊ธฐ
-- schema
CREATE TABLE Lefty (
Id INT NOT NULL AUTO_INCREMENT,
Number INT,
PRIMARY KEY(Id)
);
CREATE TABLE Righty (
Id INT NOT NULL AUTO_INCREMENT,
Number INT,
PRIMARY KEY(Id)
);
-- data
INSERT INTO Lefty (Number) VALUES (1);
INSERT INTO Righty (Number) VALUES (1);
์ผ์์ก์ด ํ ์ด๋ธ
ID
์ซ์
1
1
์ค๋ฅธ์ชฝ ํ ์ด๋ธ
ID
์ซ์
1
1
2๏ธโฃ ์์ํ์
1. ์ฒ์์ ๋ ํ ์ด๋ธ ๋ชจ๋ ํธ๋์ญ์ ์ ์์ํฉ๋๋ค. ์ฆ, BLOCKING์ ์์ํฉ๋๋ค.
โผ 2๋ช ์ ์ฌ์ฉ์(ํญ)๊ฐ ์ง๊ธ ๋์์ ๋ฌด์ธ๊ฐ๋ฅผ ์๋ํ๋ค๊ณ ์์ํด๋ณด์ธ์.
2.์ผ์ชฝ ํญ์์ ์คํ
UPDATE Righty SET Number = Number+1;
๋ณด์๋ค์ํผ UPDATE SQL์ ๊ธฐ๋ค๋ฆฌ๋ค๊ฐ... Righty๊ฐ ์ด์ ์ ์ ๊ฒผ๊ธฐ ๋๋ฌธ์ ์๋ฃ๋์ง ์์ต๋๋ค. ์์ํ ๊ธฐ๋ค๋ฆด๊ฑฐ์ผ
3. order2 ์คํ ์ค ์ค๋ฅธ์ชฝ ํญ์์ ์คํ
UPDATE Lefty SET Number = Number+1;
๊ทธ๋ฌ๋๋ ๊ต์ฐฉ์ํ ์๋ฌ๊ฐ ๋ด๋ค!! ๋ ์ฌ์ฉ์ ๋ชจ๋ ์ง๊ธ ๊ฐ ์ ๊ธ ํด์ ๋ฅผ ๊ธฐ๋ค๋ฆฝ๋๋ค.๋ชจ๋๊ฐ ๋๊ตฐ๊ฐ๊ฐ ๋ฌ๋ฆฌ๊ธฐ๋ฅผ ๋ฉ์ถ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๊ธฐ ๋๋ฌธ์ ์๋ฌด๋ ๋ฌ๋ฆฌ๊ธฐ๋ฅผ ๋ฉ์ถ ์ ์์ต๋๋ค!
If deadlock error didn't appear, you could change autocommit setting
mysql> SELECT @@session.autocommit;
+----------------------+
| @@session.autocommit |
+----------------------+
| 1 |
+----------------------+
-- change autocommit to 0
SET autocommit=0;
์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค ๐
(์์ผ๋ก ์ฐธ๊ณ ๋ง ํ์ธ์)
๋ชจ๋๊ฐ ๋๊ตฐ๊ฐ๊ฐ ๋ฌ๋ฆฌ๊ธฐ๋ฅผ ๋ฉ์ถ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๊ธฐ ๋๋ฌธ์ ์๋ฌด๋ ๋ฌ๋ฆฌ๊ธฐ๋ฅผ ๋ฉ์ถ ์ ์์ต๋๋ค!
-> ใฟใใช่ตฐใฃใฆใ, ๆญขใพใๆกไปถใฏ่ชฐใใๆญขใพใฃใใ.ใงใใฟใใช่ชฐใใๆญขใพใใฎๅพ ใฃใฆใใใใ่ชฐใๆญขใพใใพใใ.
Reference
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐ ๊ต์ฐฉ ์ํ๋ฅผ ์๋์ผ๋ก ์คํํ์! [SQL]), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://dev.to/kaziusan/lets-run-deadlock-manually-sql-1hํ ์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค