跳到主要內容

長時間執行的交易

最佳化提供可行的建議,協助您識別和解決由長時間執行的交易引起的效能問題。

長時間執行的交易可能會透過鎖定資源和長時間持有資料庫連線,對擴充性和彈性產生負面影響。以下是一個有問題的長時間執行交易的常見範例

// 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
});

問題是什麼?

長時間執行的交易可能會導致幾個嚴重的問題,損害您應用程式的效能和可靠性

  • 資料庫鎖定:長時間交易會持有資料列、資料表或其他資源的鎖定,阻止其他查詢存取。這會導致爭用和封鎖,從而嚴重中斷並行操作。

  • 連線綁定:交易在其整個持續時間內佔用資料庫連線。在連線池有限的情況下,這可能會迅速耗盡可用連線,導致整個應用程式速度變慢或故障。

  • 增加爭用:隨著鎖定累積和連線被綁定,其他交易會排隊,產生瓶頸、更高的延遲和降低的吞吐量。

  • 擴充性挑戰:長時間交易導致的效率低下在高流量系統中會被放大,限制系統有效擴充的能力。

  • 脆弱性:當長時間交易失敗或逾時時,所有中間進度都會遺失。這在具有多個相依步驟的工作流程中尤其成問題,因為從部分失敗中恢復變得複雜且容易出錯。

  • 偵錯困難:由於長時間執行的交易有多個步驟,以及可能因逾時、死鎖或意外相依性而導致的失敗,因此對其進行疑難排解具有挑戰性。