长时间运行的事务
优化功能提供可操作的建议,帮助您识别和解决由长时间运行的事务引起的性能问题。
长时间运行的事务会长时间锁定资源并占用数据库连接,从而对可扩展性和弹性产生负面影响。以下是一个常见的有问题的长时间运行事务的示例。
// 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
});
问题是什么?
长时间运行的事务可能会导致几个严重的问题,这些问题会损害应用程序的性能和可靠性。
-
数据库锁:长时间运行的事务会锁定行、表或其他资源,阻止其他查询访问。这会导致竞争和阻塞,从而严重干扰并发操作。
-
连接占用:事务在其整个持续时间内占用数据库连接。由于连接池有限,这可能会迅速耗尽可用连接,从而导致整个应用程序速度减慢或失败。
-
加剧竞争:随着锁的积累和连接被占用,其他事务会排队,从而造成瓶颈、更高的延迟和降低的吞吐量。
-
可扩展性挑战:在高流量系统中,长时间运行的事务造成的低效率会被放大,从而限制了系统有效扩展的能力。
-
脆弱性:当一个长时间运行的事务失败或超时时,所有中间进度都会丢失。这在具有多个依赖步骤的工作流程中尤其成问题,因为从部分失败中恢复变得复杂且容易出错。
-
调试困难:由于长时间运行的事务涉及多个步骤以及由超时、死锁或意外依赖关系引起的潜在故障,因此排查此类事务的故障具有挑战性。