这是indexloc提供的服务,不要输入任何密码
Skip to content

Nested transactions don't work as expected #54

@mdevecka

Description

@mdevecka

original:

try {
  await defaultManager.transaction(async mgr => {
    await mgr.withRepository(repo).insert({ name: "user1" });
    //throw new Error(`abort`);
    await mgr.withRepository(repo).insert({ name: "user2" });
    try {
      await mgr.transaction(async mgr2 => {
        await mgr2.withRepository(repo).insert({ name: "user3" });
        //throw new Error(`abort2`);
        await mgr2.withRepository(repo).insert({ name: "user4" });
      });
    }
    catch (err) {
      // ...
    }
    throw new Error(`abort3`)
  });
}
catch (err) {
  // ...
}

with typeorm-transactional:

try {
  await runInTransaction(async () => {
    await repo.insert({ name: "user1" });
    //throw new Error(`abort`);
    await repo.insert({ name: "user2" });
    try {
      await runInTransaction(async () => {
        await repo.insert({ name: "user3" });
        //throw new Error(`abort2`);
        await repo.insert({ name: "user4" });
      },{ propagation: Propagation.NESTED });
    }
    catch (err) {
      // ...
    }
    throw new Error(`abort3`)
  });
}
catch (err) {
  // ...
}

When using typeorm-transactional test case abort3 does create user3 and user4 which is not desired.
(other cases work as expected)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions