Prisma 如何可靠地返回最后插入的行,我可以通过过程调用来模拟这一点吗?

问题描述

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

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

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

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

await prisma.$executeraw(rawQuery);    

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

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

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

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

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

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

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

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

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

是否有保留程序的解决方案?这是一个消息应用程序,其中一些请求可能同时到达。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)