長時間執行的事務
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
});
問題是什麼?
長時間執行的事務可能會導致幾個關鍵問題,從而損害應用程式的效能和可靠性
-
資料庫鎖: 長時間事務會鎖定行、表或其他資源,阻止其他查詢的訪問。這會導致爭用和阻塞,從而顯著干擾併發操作。
-
連線佔用: 事務會全程佔用資料庫連線。在連線池有限的情況下,這會迅速耗盡可用連線,導致應用程式範圍內的效能下降或故障。
-
爭用增加: 隨著鎖的累積和連線的佔用,其他事務會排隊,從而產生瓶頸、更高的延遲和更低的吞吐量。
-
可伸縮性挑戰: 長時間事務導致的低效率在高流量系統中會被放大,限制了系統有效擴充套件的能力。
-
脆弱性: 當長時間事務失敗或超時時,所有中間進度都會丟失。這在具有多個依賴步驟的工作流程中尤其成問題,因為從部分故障中恢復變得複雜且容易出錯。
-
除錯困難: 由於長時間執行的事務包含多個步驟,且可能因超時、死鎖或意外依賴關係而導致失敗,因此對其進行故障排除具有挑戰性。