개발/PrismaORM

Prisma Transaction이란?, $transaction 사용 방법

Zaein 2023. 6. 1. 15:23

 

 

 

 

트랜잭션이 대체 뭘까!!!!

그게 뭐냐면~

데이터베이스에 대한 작업이 여러개 일 때 그 작업들을 하나로 묶어줌 (like... 파워포인트에서 그룹화 같은 역할...)

여러개의 작업이 한개의 로직을 구성하고 있을때 사용할 수 있음~!

 

묶여진 모든 작업들이 성공적으로 실행을 마쳐야만 데이터베이스에 저장됨

한 작업이라도 실패를 하거나 중간에 오류가 발생하면 묶여진 데이터 내에서 이전에 했던 작업들을 다시 원상복구~

 

 

 

예를들면

transaction(계란후라이 만들기) {
1. 가스레인지 불 켜고, db에 불켜기 true로 체크하기
2. 프라이팬에 기름 두르고, db에 기름 두르기 true로 체크하기
3. 냉장고에서 계란 꺼내고, 남은 계란 갯수 db에 update하기
4. 프라이팬에 계란 올리고, 완성까지 걸린 시간 db에 create하기
}

이런 코드가 있다고 치자!

(실제 transaction에는 이름을 지을 수 없고, 코드 구조도 상당히 다름.. 이해용으로만 참고하길!!)

계란후라이가 완성되면 db에는 총 4가지의 변경사항이 적용될것이다.

하지만 3번에서 오류가 발생해 4번을 실행하지 못했다면 어떻게 될까!

 

 

transaction을 사용하지 않은 코드라면

실행된 1,2번은 db에 적용이 되어있고, 오류가 난 3번과 실행되지 못한 4번은 db에 적용이 되지 않을것이다.

그럼 db에는 1,2번 데이터만 덜렁 있게 됨

 

transaction을 사용한 코드라면

3번에서 오류가 났을때, 앞에서 실행된 1,2번을 다시 롤백하여 이전상태로 되돌린다.

부분적으로 남아있는 데이터가 없고 클린~~

 

 

이렇게 transaction을 사용하면 하나로 묶여진 로직내의

모~든 작업들이 성공적으로 마쳐질 경우에만 db에 적용이 된다.

 

 

 

 

한번에 여러 테이블에서 작업이 되어야 할 때,

동시에 여러 클라이언트가 작업을 할 때,

로직내의 모든 작업이 모두 성공해야하거나 모두 실패해야 할 때 사용될 수 있다.

 

 

 

 

 

 

실사용 코드

await prisma.$transaction(async (prisma) => {
  const user = await prisma.user.create({
    data: {
      name: 'John',
      email: 'john@example.com',
    },
  });

  const post = await prisma.post.create({
    data: {
      title: 'Hello, World!',
      content: 'This is my first post.',
      userId: user.id,
    },
  });
});