0

我在 Azure Function App 上使用 Prisma,因此它是无服务器的,只有一个 prisma 客户端(const prisma = new PrismaClient();),并且在给定函数运行后我不会关闭连接。

一开始我使用prisma.myTable.create({...调用创建记录,其中响应是创建的行。从那我需要自动递增的 ID,在其他表中进行查询。

随着项目的进展,我得到了一个 MySQL 过程调用,它在表中创建了正确的条目。它有助于减少我这边对某些变量的需求,但引入了一个可靠地获取创建的行 id 的新问题。我这样调用程序:

const rawQuery = `call EM_ADDMSG('${myVar1}', '${myVar2}', '${myVar3}', NULL, NULL, NULL, '${myVar4}', @id);`;

await prisma.$executeRaw(rawQuery);    

我们尝试了 2 种方法。一个是会话变量,现在我明白它为什么失败了。

const rawId = 'select @id';
const response = await prisma.$queryRaw(rawId);
return response[0]['@id'];

如果多个请求同时到达,则响应有时包含相同的 id。我相信这是意料之中的,因为我只有一个会话,而且似乎即使我做了 2 次插入,仍然从会话中取回之前的 @id。

第二种方法是在不同的表中跟踪 id。插入后读取该表并删除该行。我尝试在delete()不查询的情况下使用 prismas,因为这也会返回已删除的行。以缓慢的速度它也在工作,但是几乎同时有多个我遇到了一个错误,没有什么可删除的。(该表中还有另一个标识符用于选择该行)。我得到错误:

一项操作失败,因为它依赖于一个或多个需要但未找到的记录。要删除的记录不存在。

看起来,顺序是插入、插入、删除,但第二次删除失败,因为表是空的。

迄今为止最安全的解决方案是await prisma.$transaction([...用于插入和删除该行,但在这种情况下,我得到了错误:

代码:1213,消息:“尝试获取锁定时发现死锁;尝试重新启动事务”,状态:“40001”

它至少是一致的,所以没有 id 混淆。

是否有解决此问题的方法来保持程序?这是一个消息传递应用程序,其中一些请求可能同时到达。

4

0 回答 0