Skip to content

Commit

Permalink
fix(core): don't propagate changes from em.transactional() to upper…
Browse files Browse the repository at this point in the history
… context if its global

Related: #5309
  • Loading branch information
B4nan committed Mar 6, 2024
1 parent 2fb4f58 commit 7ac9a19
Showing 1 changed file with 18 additions and 11 deletions.
29 changes: 18 additions & 11 deletions packages/core/src/EntityManager.ts
Expand Up @@ -1237,24 +1237,31 @@ export class EntityManager<Driver extends IDatabaseDriver = IDatabaseDriver> {
loggerContext: options.loggerContext,
});
options.ctx ??= em.transactionContext;
const propagateToUpperContext = !em.global || this.config.get('allowGlobalContext');

return TransactionContext.create(fork, async () => {
return fork.getConnection().transactional(async trx => {
fork.transactionContext = trx;
fork.eventManager.registerSubscriber({
afterFlush(args: FlushEventArgs) {
args.uow.getChangeSets()
.filter(cs => [ChangeSetType.DELETE, ChangeSetType.DELETE_EARLY].includes(cs.type))
.forEach(cs => em.unitOfWork.unsetIdentity(cs.entity));
},
});

if (propagateToUpperContext) {
fork.eventManager.registerSubscriber({
afterFlush(args: FlushEventArgs) {
args.uow.getChangeSets()
.filter(cs => [ChangeSetType.DELETE, ChangeSetType.DELETE_EARLY].includes(cs.type))
.forEach(cs => em.unitOfWork.unsetIdentity(cs.entity));
},
});
}

const ret = await cb(fork);
await fork.flush();

// ensure all entities from inner context are merged to the upper one
for (const entity of fork.unitOfWork.getIdentityMap()) {
em.unitOfWork.register(entity);
entity.__helper!.__em = em;
if (propagateToUpperContext) {
// ensure all entities from inner context are merged to the upper one
for (const entity of fork.unitOfWork.getIdentityMap()) {
em.unitOfWork.register(entity);
entity.__helper!.__em = em;
}
}

return ret;
Expand Down

0 comments on commit 7ac9a19

Please sign in to comment.