There are easy way to use transaction in prisma?
I have the controller, service and repository and only the repository must have the prisma client implementation, but i need to use prisma service inside the service to initialize an transaction and pass to the repository the transaction instance...
in spring boot i only need to add the @Transaction in the main service function and everthing inside is in transaction
Service:
await this.prisma.$transaction(
async (transaction: Prisma.TransactionClient) => {
const createdCompany = await this.companyRepository.createCompany(
companyCreate,
transaction,
);
})
Repository:
async createCompany(
companyBody: PrismaInterfaces.CompanyCreateInput,
transaction?: PrismaInterfaces.TransactionClient,
) {
const prisma = transaction || this.prisma;
return await prisma.company.create({
data: companyBody,
});
}
2 Replies
Please use triple ticks ( ` three times) so that code is formatted.
I think I need more information to understand what you're trying to achieve. Is your API or code calling your repository or service?
Generally speaking, you probably don't need a repository pattern. Are you using that to ensure that prisma is a singleton?
I would have written your service code like so:
But also note: there's only one call there. One db call in a transaction is the same as not having the transaction at all
You can learn more about transactions here: https://www.prisma.io/docs/orm/prisma-client/queries/transactions#transactions-overview
Transactions and batch queries (Reference) | Prisma Documentation
This page explains the transactions API of Prisma Client.
It was just an example, in my project i have repository pattern to abstract the queries because i have many queries that have more than 500 lines to filter, select, order by etc and if i dont use repository pattern my service class would have 30k of lines
I thought that was possible to create a function that generated one transaction and pass through the transaction instance like:
your example case is usefull but i need to make N calls in transaction and most part is not followed by each other, i call function X and then make and http request for another service and then i call function Y and i can't do
because between them i need to make request for http external service after functionX