Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DBOSFailedSqlTransactionError #640

Merged
merged 5 commits into from
Oct 9, 2024
Merged

DBOSFailedSqlTransactionError #640

merged 5 commits into from
Oct 9, 2024

Conversation

devhawk
Copy link
Collaborator

@devhawk devhawk commented Oct 7, 2024

If a @Transaction method invokes a user-authored stored procedure that raises an exception, the db transaction is aborted even if the exception is caught in the @Transaction method. If the exception is caught and handled in the @transaction method, DBOS will fail when it attempts to write the @Transaction method return value to the transaction_outputs table because the associated db transaction has been aborted. This PR creates a DBOS specific error to throw in this situation.

Fixes #626

src/error.ts Outdated Show resolved Hide resolved
src/workflow.ts Outdated
this.resultBuffer.clear();
} catch (error) {
if (this.#dbosExec.userDatabase.isFailedSqlTransactionError(error)) {
this.logger.error(`Postgres aborted the ${txn.name} transaction of Workflow ${workflowUUID}. Something, such as a stored procedure, in the database caused the transaction to abort.`);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
this.logger.error(`Postgres aborted the ${txn.name} transaction of Workflow ${workflowUUID}. Something, such as a stored procedure, in the database caused the transaction to abort.`);
this.logger.error(`Postgres aborted the ${txn.name} transaction of Workflow ${workflowUUID}, but the function did not raise an exception. Please ensure that if a transaction encounters an exception it raises an exception.`);

src/workflow.ts Outdated
this.resultBuffer.clear();
} catch (error) {
if (this.#dbosExec.userDatabase.isFailedSqlTransactionError(error)) {
this.logger.error(`Postgres aborted the ${txn.name} @Transaction of Workflow ${workflowUUID}, but the function did not raise an exception. Please ensure that if a transaction aborts from an exception, that exception is allowed to escape the @Transaction method.`);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we want to emphasize that if a transaction aborts from an exception, we must raise an exception.

Suggested change
this.logger.error(`Postgres aborted the ${txn.name} @Transaction of Workflow ${workflowUUID}, but the function did not raise an exception. Please ensure that if a transaction aborts from an exception, that exception is allowed to escape the @Transaction method.`);
this.logger.error(`Postgres aborted the ${txn.name} @Transaction of Workflow ${workflowUUID}, but the function did not raise an exception. Please ensure that if a transaction aborts from an exception, it must raise an exception.`);

@devhawk devhawk merged commit 6692ae6 into main Oct 9, 2024
2 checks passed
@devhawk devhawk deleted the devhawk/issue626 branch October 9, 2024 21:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Stored Procedures Swallow Errors
2 participants