【发布时间】:2021-12-01 00:21:52
【问题描述】:
我目前正在尝试使用 Prisma 的新“interactiveTransactions”预览功能。但是,它似乎并没有真正将我的数据库更改作为一个事务进行。
每当我创建新报告时,我都会尝试更新学校餐桌上的增量数字。
这就是我的表格的样子:
model Report {
id String @id @default(cuid())
name String
publicId Int
schoolId String
school @relation(fields: [schoolId], references: [id])
@@unique([publicId, schoolId])
}
model School {
id String @id @default(cuid())
name String
incrementalReportNumber Int @default(1001)
reports Report[]
}
每当我创建新报告时,用于递增数字的代码如下所示:
report = await prisma.$transaction(async () => {
// get current report number
const school = await prisma.school.findUnique({
where: {
id: school.id
}
});
const newIncrementalReportNumber = school.incrementalReportNumber + 1;
// Increase incrementalReportNumber
await prisma.school.update({
where: { id: school.id },
data: {
incrementalReportNumber: newIncrementalReportNumber
}
});
// Create report
const newReport = await prisma.report.create({
data: {
publicId: newIncrementalReportNumber,
name: 'new report'
},
});
// Return
return newReport;
});
当我同时创建多个报告时,我收到“唯一约束失败”错误,
the Error PrismaClientKnownRequestError: Unique constraint failed on the fields: (`publicId`,`schoolId`)
因为当我得到 incrementalReportNumber 时,一些进程具有相同的值,尽管其他进程已经递增它。
我使用 prisma 注册了“interactiveTransactions”预览功能,如下所示:
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
generator client {
provider = "prisma-client-js"
previewFeatures = ["interactiveTransactions"]
}
我正在使用 Prisma 版本“3.2.1”
【问题讨论】:
-
能否请您提供以下详细信息:1.
newIncrementalReportNumber的值来自哪里以及 2. 您的 Prisma Schema 的确切外观是什么样的? -
1. newIncrementalReportNumber 显示在代码中。 2. 架构更新
-
关于 1:在您的代码中,变量
school包含从数据库中检索到的对象,但newIncrementalReportNumber被分配为比另一个名为theBusiness的对象的报告编号大 1,a其他地方没有提到的变量。这是一个可能的错误吗? -
抱歉,代码更新了
-
谢谢,我会试试看能否找出问题所在。如果我能确定什么,会回复你!
标签: postgresql transactions prisma