长时间运行的事务
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
});
问题是什么?
长时间运行的事务可能会导致几个关键问题,从而损害应用程序的性能和可靠性
-
数据库锁: 长时间事务会锁定行、表或其他资源,阻止其他查询的访问。这会导致争用和阻塞,从而显著干扰并发操作。
-
连接占用: 事务会全程占用数据库连接。在连接池有限的情况下,这会迅速耗尽可用连接,导致应用程序范围内的性能下降或故障。
-
争用增加: 随着锁的累积和连接的占用,其他事务会排队,从而产生瓶颈、更高的延迟和更低的吞吐量。
-
可伸缩性挑战: 长时间事务导致的低效率在高流量系统中会被放大,限制了系统有效扩展的能力。
-
脆弱性: 当长时间事务失败或超时时,所有中间进度都会丢失。这在具有多个依赖步骤的工作流程中尤其成问题,因为从部分故障中恢复变得复杂且容易出错。
-
调试困难: 由于长时间运行的事务包含多个步骤,且可能因超时、死锁或意外依赖关系而导致失败,因此对其进行故障排除具有挑战性。