Skip to content

nicheeeer/prisma-transaction

Repository files navigation

@nicheeeer/prisma-transaction

Introduction

prisma-transaction is a library that provides a simple way to use transactions in Prisma within NestJS using decorators.
It simplifies handling transactions and ensures consistency across services by utilizing AsyncLocalStorage to manage transactions within Prisma extensions.

Installation

npm install @nicheeeer/prisma-transaction

or

yarn add @nicheeeer/prisma-transaction

Usage

1️⃣ Extend prisma client

This library extends Prisma using its extension feature

import { createTransactionExtension } from '@nicheeeer/prisma-transaction';

const prisma = new PrismaClient().$extends(createTransactionExtension());

2️⃣ Use the @Transaction Decorator

Apply the @Transaction decorator to a method where you want to execute a transaction:

import { Injectable } from '@nestjs/common';
import { Transaction } from '@nicheeeer/prisma-transaction';

@Injectable()
export class UserService {
  constructor(private readonly prisma: PrismaService) {}

  @Transaction()
  async createUser(userData: { name: string; email: string }) {
    return this.prisma.user.create({
      data: userData,
    });
  }
}

Transaction Options

The @Transaction decorator supports the following options:

export interface TransactionOptions {
  /**
   * The maximum amount of time Prisma Client will wait to acquire a transaction from the database. The default value is 2 seconds.
   */
  maxWait?: number;
  
  /**
   * The maximum amount of time the interactive transaction can run before being canceled and rolled back. The default value is 5 seconds.
   */
  timeout?: number;
  
  /**
   * By default this is set to the value currently configured in your database.
   */
  isolationLevel?: Prisma.TransactionIsolationLevel;
}

You can specify transaction options when using the @Transaction decorator:

@Transaction({ isolationLevel: Prisma.TransactionIsolationLevel.ReadCommitted, maxWait: 3000, timeout: 10000 })
async updateUser(email: string) {
  return prisma.user.findFirst({
    where: { email } 
  });
}

The createTransactionExtension function also supports transaction options

import { PrismaClient } from '@prisma/client';
import { createTransactionExtension } from '@nicheeeer/prisma-transaction';

const prisma = new PrismaClient().$extends(createTransactionExtension({ isolationLevel: Prisma.TransactionIsolationLevel.ReadCommitted, maxWait: 3000, timeout: 10000 }));

License

MIT License

About

prisma-transaction is a library that provides a simple way to use transactions in Prisma within NestJS using decorators

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published