长时间运行的事务
Optimize 提供可操作的建议,帮助您识别和解决由长时间运行的事务引起的性能问题。
长时间运行的事务通过锁定资源和长时间占用数据库连接,可能对可伸缩性和弹性产生负面影响。下面是一个常见的有问题的长时间运行事务示例
// Example: A single massive transaction performing multiple steps
await prisma.$transaction(async (prisma) => {
const order = await prisma.order.create({
data: {
/* ... */
},
});
await prisma.user.update({
where: { id: userId },
data: { balance: { decrement: order.total } },
});
await prisma.shipping.create({ data: { orderId: order.id /* ... */ } });
// Additional dependent operations
});
问题是什么?
长时间运行的事务可能导致几个关键问题,损害应用程序的性能和可靠性
-
数据库锁:长时间运行的事务会锁定行、表或其他资源,阻止其他查询访问。这会导致资源竞争和阻塞,从而严重干扰并发操作。
-
连接占用:事务会在其整个持续时间内占用数据库连接。连接池有限时,这会迅速耗尽可用连接,导致应用程序范围内的速度下降或故障。
-
竞争加剧:随着锁的累积和连接被占用,其他事务会排队等待,从而产生瓶颈、更高的延迟和降低的吞吐量。
-
可伸缩性挑战:长时间运行的事务导致的效率低下在高流量系统中会放大,限制了系统有效扩展的能力。
-
脆弱性:当长时间运行的事务失败或超时时,所有中间进度都会丢失。这在具有多个依赖步骤的工作流中尤为棘手,因为从部分故障中恢复变得复杂且容易出错。
-
调试困难:长时间运行的事务涉及多个步骤,且可能因超时、死锁或意外依赖关系而失败,这使得故障排除变得具有挑战性。