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๋ฅผ ์“ธ ๊ฒฝ์šฐ ์œ ์˜ํ•ด์•ผ ํ•œ๋‹ค.