sequelize transaction - boostcamp-2020/IssueTracker-14 GitHub Wiki
sequelize transaction
Issue ์์ฑ์ assignee, label, milestone๊ณผ ๊ฐ์ ๋ค๋ฅธ table์๋ ๋์์ ์์ฑ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ ค์ค์ผ ํด์ transaction์ ์ฌ์ฉํ๋ค.
const createIssue = async (req, res) => {
const t = await db.sequelize.transaction();
try {
const {
title,
description,
milestoneid,
assigneeIdList,
labelIdList,
} = req.body;
const { id: authorid } = req.user;
const { id: issueid } = await IssueModel.create(
{
title,
description,
authorid,
milestoneid,
status: "open",
},
{ transaction: t }
);
await AssigneeModel.bulkCreate(
JSON.parse(assigneeIdList).map((userid) => {
return { issueid, userid };
}),
{ transaction: t }
);
await LabelHasIssueModel.bulkCreate(
JSON.parse(labelIdList).map((labelid) => {
return { issueid, labelid };
}),
{ transaction: t }
);
await t.commit();
return res.status(200).json({ message: "success" });
} catch (error) {
await t.rollback();
return res.status(400).json({ message: "fail", error: error.message });
}
};
JSON.parse
req.bdoy๋ก ๋ฐฐ์ด์ ๋ฐ์ ์ string์ผ๋ก ๋ค์ด์ค๊ธฐ ๋๋ฌธ์ JSON.parse()
๋ฅผ ํตํด ํ์ฑํด์ค์ผ ํ๋ค.
bulkCreate
๊ฐ์ฒด๋ค์ ๋ฐฐ์ด์ ํตํด bulkCreate ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
transaction option
transaction์ ํฌํจ๋๋ ์ฟผ๋ฆฌ๋ค์ {transaction: t}
์ ๊ฐ์ด ์ต์
์ ์ค์ผ ํ๋ค.
rollback์ด ๋์ง ์๋ ์๋ฌ
labelId๋ก ์๋ ๊ฐ์ ๋ฃ์์ ๋ rollback()์ด ๋์ด์ผ ํ๋๋ฐ ๋์ง ์๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ๋ค.
๋ชจ๋ ์ฟผ๋ฆฌ์ await
์ค์ ์ ํด์ค์ผ ํ๋๋ฐ ๊ทธ๋ ์ง ์์์ ์๊ธด ์ค๋ฅ์๋ค.
๋น๋๊ธฐ ๋ก์ง์ await, async
๋ฅผ ์ธ ๊ฒฝ์ฐ ์ ์ํด์ผ ํ๋ค.