* Transactions*
This document describes how to support transactions in the domain of
workflow engine and subsystems.

The use cases for transactions in workflows is to enable consistency
during workflow executions.

* Constraints *

The constraints for this are related to different types of transaction problems:

Workflow transaction execution should be in one single transaction
(until idle elements are reached or there are no more elements to
process)

Process state should be consistent in storage in one single
transaction. In the case of database multiple tables should be written
in an atomic transaction

Reactive code should be removed as it does not behave properly with
transactions.

Transactions Policy among workflow runtime and subsystems should be
consistent in terms of configuration (no subcomponent should start a
transaction if there is already one on the go, but they should mandate
to be in a transaction)

Error handling should still produce an event that can be stored.

Subsystems execution should be included during transactions

Async execution will spawn its own transaction.

* Architecture *

The architecture of the solution impacts some areas:

Components with reactive that are involved in transaction refactor. So
far, the only subsystem using reactive code job service.

Process Code generation should change in order to reflect the
transactions of the workflow engine

Error handling should be modified in a way the error is captured
outside the transaction and handled in a different one to avoid event
loss.

Exchange information among runtime and subsystems should be in a way
that those elements are involved in a transaction or they can be
rolled back. At the moment the communication is being done with a rest
call that is not part of the transaction and cannot be rolled back.

Events produced within the transaction should be part of the
transaction as well to avoid phantom events (events producing during
workflow execution that are sent at the end of the unit of work)

* Risk Assessment *

The risks identified for this work are the following:

Error handling can be problematic depending where we set the
boundaries of the transaction. There are two different approaches:

Boilerplate code for each task to start / commit / rollback the
transaction and deail with error in the rest call tier itself

Use the runtime environment to install error handling for doing the operation.

Exchange information among systems in a non-transactional way. There
are a couple of approaches

Install every time a transaction sync listener whenever the rest call
is made against the subsystem and doing a compensation when it fails

Wrap the rest call in a XAResource that can be enlisted in the transaction.

The use of Kafka clients for stream that does not belong to the transactions

Wrap with XAResource (Kafka client support transactions, but does not
offer XAresource)

Install a transaction sync for each transaction.

Performance impact with transactions.

Different transaction methods in quarkus and spring boot

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@kie.apache.org
For additional commands, e-mail: dev-h...@kie.apache.org

Reply via email to