長時間実行されるトランザクション
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
});
問題点とは?
長時間実行されるトランザクションは、アプリケーションのパフォーマンスと信頼性を損なういくつかの重大な問題を引き起こす可能性があります。
-
データベースロック: 長時間トランザクションは、行、テーブル、その他のリソースにロックを保持し、他のクエリからのアクセスを妨げます。これにより、競合やブロックが発生し、同時実行操作を著しく妨げる可能性があります。
-
接続の占有: トランザクションは、その実行期間中、データベース接続を占有します。接続プールが限られている場合、これにより利用可能な接続がすぐに枯渇し、アプリケーション全体の速度低下や障害を引き起こす可能性があります。
-
競合の増加: ロックが蓄積され、接続が占有されると、他のトランザクションがキューイングされ、ボトルネック、高レイテンシ、スループットの低下を引き起こします。
-
スケーラビリティの課題: 長時間トランザクションによって引き起こされる非効率性は、高トラフィックシステムで増幅され、システムの効果的なスケーリング能力を制限します。
-
脆弱性: 長時間トランザクションが失敗またはタイムアウトすると、すべての中間進行状況が失われます。これは、複数の依存するステップを持つワークフローで特に問題となり、部分的な障害からの回復が複雑でエラーが発生しやすくなります。
-
デバッグの困難さ: 長時間実行されるトランザクションのトラブルシューティングは、その複数のステップと、タイムアウト、デッドロック、予期しない依存関係によって引き起こされる可能性のある障害のために困難です。