Skip to content

Commit 689134c

Browse files
attemptTransactionOnly
1 parent 30cac05 commit 689134c

File tree

1 file changed

+25
-32
lines changed

1 file changed

+25
-32
lines changed

src/sessions.ts

Lines changed: 25 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -588,7 +588,7 @@ function userExplicitlyEndedTransaction(session: ClientSession) {
588588
return USER_EXPLICIT_TXN_END_STATES.has(session.transaction.state);
589589
}
590590

591-
function attemptTransaction<T>(
591+
async function attemptTransaction<T>(
592592
session: ClientSession,
593593
startTime: number,
594594
fn: WithTransactionCallback<T>,
@@ -604,44 +604,37 @@ function attemptTransaction<T>(
604604
}
605605

606606
if (!isPromiseLike(promise)) {
607-
session.abortTransaction().catch(() => null);
608-
return Promise.reject(
607+
await session.abortTransaction().catch(() => null);
608+
return await Promise.reject(
609609
new MongoInvalidArgumentError('Function provided to `withTransaction` must return a Promise')
610610
);
611611
}
612612

613-
return promise.then(
614-
result => {
615-
if (userExplicitlyEndedTransaction(session)) {
616-
return result;
617-
}
618-
619-
return attemptTransactionCommit(session, startTime, fn, result, options);
620-
},
621-
err => {
622-
function maybeRetryOrThrow(err: MongoError): Promise<any> {
623-
if (
624-
err instanceof MongoError &&
625-
err.hasErrorLabel(MongoErrorLabel.TransientTransactionError) &&
626-
hasNotTimedOut(startTime, MAX_WITH_TRANSACTION_TIMEOUT)
627-
) {
628-
return attemptTransaction(session, startTime, fn, options);
629-
}
630-
631-
if (isMaxTimeMSExpiredError(err)) {
632-
err.addErrorLabel(MongoErrorLabel.UnknownTransactionCommitResult);
633-
}
634-
635-
throw err;
636-
}
613+
try {
614+
const result = await promise;
615+
if (userExplicitlyEndedTransaction(session)) {
616+
return result;
617+
}
618+
return await attemptTransactionCommit(session, startTime, fn, result, options);
619+
} catch (err) {
620+
if (session.inTransaction()) {
621+
await session.abortTransaction();
622+
}
637623

638-
if (session.inTransaction()) {
639-
return session.abortTransaction().then(() => maybeRetryOrThrow(err));
640-
}
624+
if (
625+
err instanceof MongoError &&
626+
err.hasErrorLabel(MongoErrorLabel.TransientTransactionError) &&
627+
hasNotTimedOut(startTime, MAX_WITH_TRANSACTION_TIMEOUT)
628+
) {
629+
return await attemptTransaction(session, startTime, fn, options);
630+
}
641631

642-
return maybeRetryOrThrow(err);
632+
if (isMaxTimeMSExpiredError(err)) {
633+
err.addErrorLabel(MongoErrorLabel.UnknownTransactionCommitResult);
643634
}
644-
);
635+
636+
throw err;
637+
}
645638
}
646639

647640
const endTransactionAsync = promisify(

0 commit comments

Comments
 (0)