์ด์·๊ด๋ฆฌํ๋ ์ฌ์ดํธ ์ค, ์๊ทผ๋ ์ ๋ ์๋๊ฐ ์ ํ๋ ์ฌ์ดํธ๊ฐ ์๋ค.
์๋๋ณด๋ค๋ ํฐ ๋ฌธ์ ๊ฐ ์์๋๋ฐ ํน์ ํ ์ด๋ธ์์ DB Lock์ด ์ง์์ ์ผ๋ก ๊ฑธ๋ฆฐ๋ค๋ ๊ฒ์ด์๋ค. ์ด๊ฒ์ ์๋์ ๋ฌธ์ ๊ฐ ์๋ ์ฌ์ฉ์ ๋ฌธ์ ์ด๊ธฐ ๋๋ฌธ์ ์ปค๋ค๋ ์ด์์๋ค. '๋ฐ์ดํฐ ์์ ์ด ์๋๋ค, ์์ ์ ์๊พธ ํ๋ฉด์ด ๋ฉ์ถฐ๋ฒ๋ฆฐ๋ค.' ๋ผ๋ ๊ธด๊ธ ์์ฒญ์ ๊ธํ๋๋ก ์ฐ์ Lock์ killํ๊ธฐ๋ฅผ ์ฌ๋ฌ๋ฒ. ์๋๊ฒ ๋ค์ถ์ด, ์ข ๋ ์์ธํ ๋ค์ฌ๋ค๋ดค๋ค.
Database๊ฐ Oracle์ธ ์ฌ์ดํธ์๊ณ , ์ด์ Oacle lock์ด ๊ฑธ๋ ค์๋ ํ ์ด๋ธ๊ณผ SQL query๋ฅผ ์กฐํํด๋ณด์๋ค. ์ญ์ ํน์ ํ ์ด๋ธ์์ Lock์ด ๊ฑธ๋ ค์์๋๋ฐ, ๋์ ๋๋ ๊ฒ์ ํด๋น ํ ์ด๋ธ๊ณผ ์ ๋ฌด์ ์ผ๋ก ์ฎ์ฌ์๋ ํน์ ํ ํ ์ด๋ธ๋ค์ด ํจ๊ป ๊ฑธ๋ ค์๋ค๋ ์ ์ด์๋ค.
'์, ์ ํ ์ด๋ธ๋ค์ด ๊ณต๋์ผ๋ก ๋ฌด์ธ๊ฐ ์์ ์ ์ํํ๋ค๊ฐ Lock์ด ๊ฑธ๋ ธ๊ตฌ๋. ์ ๊ฒ๋ค์ด ์ฎ์ธ ์ ๋ฌด๊ฐ ๋ญ๊ฐ ์์ง?'
๊ทธ๋ฌํ ์๊ฐ๊ณผ Lock์ ๋ฐ์์ํจ SQL query์ ๋ฐ๋ผ ์ฌ๋ผ๊ฐ๋ค๋ณด๋ ์ธํฐํ์ด์ค๋ผ๋ ๊ฒฐ๋ก ์ด ๋์๋ค.
ํด๋น ์ธํฐํ์ด์ค์ ๋ก๊ทธ ๊ธฐ๋ก์ ๋ณด๋, ๊ณ์ํ์ฌ Error Log๊ฐ ๋จ์ด์ง๊ณ ์์๋ค.
ํ ์์คํ ๊ณผ ๋ฐ์ดํฐ ์ก์์ ์ ํ๋ ์ธํฐํ์ด์ค ์, ๋ค๋์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋๋ค. ์ธํฐํ์ด์ค๋ฅผ ๊ฐ๋ฐํ ๊ฐ๋ฐ์์ ์ญ๋์ ๋ฐ๋ผ Log์ ์ง๋ ์ฒ์ฐจ๋ง๋ณ์ด๊ธฐ ๋๋ฌธ์, Log๋ง์ผ๋ก Error์ ์์ธ์ ์ถ์ธกํ๊ธฐ ์ด๋ ค์ ๋ค.
for(Object obj:resultList) {
Map dataMap = (Map) obj;
rowData = COMPANYCODE+"|"
+dataMap.get("ID")+"|"
+dataMap.get("DESCRIPTION")+"|"
try {
if(testDAO.checkMethod(dataMap > 0) {
testDAO.updateMethod(dataMap);
} else {
testDAO.insertMethod(dataMap);
}
} catch (SqlIgnoreException se) {
se.printStackTrace();
isSuccess = false;
}
}
์ฝ๋์ ์์ฃผ ์ผ๋ถ๋ถ์ ๊ฐ๊ณตํ์ฌ ๋ผ์ด์จ ๊ฒ์ด๋ค. ํด๋น ์ธํฐํ์ด์ค๋ ๋งค์ผ ์๋ฒฝ๋ง๋ค 1๋ฒ์ฉ ๋ฐฐ์น ์๋น์ค๋ก ๊ตฌ๋๋๊ณ ์์๋ค. ๊ทธ๊ฐ ์ฑ๊ณตํ์ง ๋ชปํ ์ญ์ฌ๋ง๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ํ๋ฃจ์ข ์ผ ๋ฐ์์ค๊ณ ์๋๋ฐ(์ค์ Logํ์ผ์ ๋ค์ ธ๋ณด๋ ์ ๋ง ํ๋ฃจ์ข ์ผ ๋๊ณ ์์๋ค. ๊ณตํฌ์ค๋ฌ์ ๋ค..) , ๋์ผ ํ ์ด๋ธ์ ์ฌ์ฉํ๋ ๋ค๋ฅธ ๊ฒ์ํ์์ ๋ฐ์ดํฐ ์์ ์ ์๋ํ๋ Lock์ด ๊ฑธ๋ฆด๋ง๋ ํ๋ค. ๊ทธ๊ฒ๋ ๋ชจ๋ฅด๊ณ ๊ทธ๋๊ทธ๋ Lock๋ง killํ๊ณ ์์ผ๋, ๋ค์๋ ์ด ๋๋ฉด ๋ Lock์ด ๊ฑธ๋ฆฌ๋๊ฒ ๋น์ฐํ๋ค.
์ด ์ ์ ๊ฐ์ ํ๊ธฐ ์ํ์ฌ, ์ try~catch์ method๋ค์ ํธ๋์ญ์ ๋ถ๋ฆฌํด์ฃผ๋ ์์ ์ด ํ์ํ๋ค. ์ 3๊ฐ์ method๋ฅผ ํ๋์ ์์ ์ผ๋ก ๋ถ๋ฅํ๊ณ , ํ๋์ method์ ๋ด์ ๊ทธ method๋ฅผ ํธ๋์ญ์ ์ผ๋ก ๋ฌถ์๋ค.
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class, noRollbackFor = SqlIgnoreException.class)
public void testMethod(Map dataMap) throws SqlIgnoreException {
if(testDAO.checkMethod(dataMap) > 0) {
testDAO.updateMethod(dataMap);
} else {
testDAO.insertMethod(dataMap);
}
}
for๋ฌธ์ผ๋ก ์ญ์ฌ๋ง๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋๋ผ๋, ๊ฑด ๋น Commit์ด ๋๋ฏ๋ก ๋์ด์ for๋ฌธ์ด ๋๋ ๋๊น์ง ๋๊ธฐํ์ง ์์๋ ๋ ๊ฒ์ด๋ค. ์ค์ ๋ก ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ ํ์๋ ํ๋ฒ๋ Lock์ด ๊ฑธ๋ฆฌ์ง ์์๋ค.