fix: v0.6.1 生产可用性深度审查 — MemoryEngine 级联环无限递归(P0)/ KVStore 多表事务与级联原子化 / 未open防护统一 / 27 个异常场景测试 + aria级联回归
This commit is contained in:
+11
-2
@@ -489,9 +489,18 @@ export class MemoryEngine implements IStorageEngine {
|
||||
|
||||
/**
|
||||
* 级联删除:查找引用 tableName.pkValue 的所有表的行并删除。
|
||||
* v0.6.1-fix: 环路保护(A→B→A 级联环不再无限递归栈溢出,AriaEngine 同语义)。
|
||||
* @returns 级联删除的行数
|
||||
*/
|
||||
private async cascadeDelete(tableName: string, pkValue: string, _row: Record<string, unknown>): Promise<number> {
|
||||
private async cascadeDelete(
|
||||
tableName: string,
|
||||
pkValue: string,
|
||||
_row: Record<string, unknown>,
|
||||
visited: Set<string> = new Set(),
|
||||
): Promise<number> {
|
||||
const visitKey = `${tableName}:${pkValue}`;
|
||||
if (visited.has(visitKey)) return 0;
|
||||
visited.add(visitKey);
|
||||
let totalCascade = 0;
|
||||
|
||||
for (const [refTableName, refSchema] of this.schemas) {
|
||||
@@ -529,7 +538,7 @@ export class MemoryEngine implements IStorageEngine {
|
||||
if (refRow) {
|
||||
// v0.3.3: 级联删除前清理索引条目
|
||||
this.removeIndexEntries(refTableName, refRow, refPk);
|
||||
totalCascade += await this.cascadeDelete(refTableName, refPk, refRow);
|
||||
totalCascade += await this.cascadeDelete(refTableName, refPk, refRow, visited);
|
||||
}
|
||||
refTableData.delete(refPk);
|
||||
totalCascade++;
|
||||
|
||||
Reference in New Issue
Block a user