Transactions
여러 작업을 하나로 묶어 모두 성공하거나 모두 실패(롤백)하도록 보장하는 기능. 결제와 같은 데이터 무결성이 핵심인 서비스에 필수 기능.
Transactions 사용하기
import mongoose from "mongoose";
import { Post, MyPostsContainer } from "@/Models/index.js";
const createPost = async (req, res) => {
const { user_id } = req.header;
const { title, content } = req.body;
/*
* session 객체 생성
*/
const session = await mongoose.startSession();
try {
/*
* 트랜잭션 시작
*/
session.startTransaction();
/*
* create 메서드에 session을 사용할 때는 배열 형태로 데이터를 전달
* create 메서드의 반환 값은 배열
*/
const [newPost] = await Post.create(
[{ author: user_id, title, content }],
{ session } // 옵션 객체에 session 객체 전달
);
await MyPostsContainer.findOneAndUpdate(
{ user_id },
{ $push: { posts: newPost._id } },
{ session } // 옵션 객체에 session 객체 전달
);
/*
* 트랜잭션 커밋
*/
await session.commitTransaction();
res.status(201).json({ message: "게시글을 생성하였습니다." });
} catch (error) {
/*
* 에러시 트랜잭션 롤백
*/
await session.abortTransaction();
throw error
} finally {
/*
* 트랜잭션 종료
*/
await session.endSession();
}
};