perf: optimize portfolio queries and workflows

This commit is contained in:
陈煜 committed 2026-10-02 12:44:07 +08:00
1 parent da98d02661
commit a7e0a0fe58
45 files changed
+4446 -637

No files matched your search

+18 -1
View File
@@ -1,7 +1,24 @@
import { Injectable, OnModuleInit, OnModuleDestroy } from '@nestjs/common';
import { PrismaClient } from '@prisma/client';
import { PrismaClient, Prisma } from '@prisma/client';
@Injectable()
export class Database extends PrismaClient implements OnModuleInit, OnModuleDestroy {
async serial<T>(work: (tx: Prisma.TransactionClient) => Promise<T>): Promise<T> {
for (let attempt = 0; ; attempt++) {
try {
return await this.$transaction(work, {
isolationLevel: Prisma.TransactionIsolationLevel.Serializable,
});
} catch (error) {
// Serializable deadlock/write conflict; retry the entire atomic operation.
const retryable =
error instanceof Prisma.PrismaClientKnownRequestError &&
(error.code === 'P2034' ||
(error.code === 'P2010' && ['1213', '1205'].includes(String(error.meta?.code))));
if (!retryable || attempt >= 3) throw error;
await new Promise((resolve) => setTimeout(resolve, 20 * 2 ** attempt + Math.random() * 20));
}
}
}
async onModuleInit() {
await this.$connect();
}