9.1.1 Scenario: Withdraw and Deposit an Amount

The following steps describe an example sequence for the successful path of an XA transaction when you run the sample application. Let us consider a scenario, where a user places a request to withdraw an amount from Department One and deposit that amount into Department Two. In case of failures, the initiating application calls a rollback instead of a commit.

It is assumed that Department One and Department Two use XA-compliant resource managers.
  1. User places a request to transfer an amount from Department One to Department Two.
  2. The Teller service initiates the transaction, when a user places a request to withdraw an amount from Department One. The transaction initiator service, Teller, makes a call to MicroTx Distributed Transactions to begin an XA transaction.

    MicroTx Distributed Transactions creates a new global transaction ID (GTRID) to track the transaction, writes the GTRID to the data store, and returns the GTRID to the transaction initiator service.

  3. The Teller sends a request to Department One to withdraw an amount.
  4. The transaction participant service, Department One enlists to MicroTx Distributed Transactions with the same GTRID. MicroTx Distributed Transactions may have to interact with multiple participant services to successfully complete a transaction. MicroTx Distributed Transactions also creates a branch ID that is unique to each participant service. The XID contains both the GTRID and branch ID, so the XID is unique for each participant service.
  5. In XA protocol, MicroTx Distributed Transactions manages the communication between participant microservices, such as Department One, and the resource manager. Department One must use the MicroTx client libraries which registers callbacks and provides implementation of the callbacks for the resource manager.
  6. Department One performs the DML operation to withdraw the amount, and then returns a response.
  7. The Teller service initiates another request to deposit an amount to Department Two.
  8. The transaction participant service, Department Two enlists to MicroTx Distributed Transactions with the same GTRID. MicroTx Distributed Transactions coordinator creates a branch ID that is unique to Department Two.
  9. Department Two communicates with the resource manager using the integrated MicroTx Distributed Transactions library.
  10. Department Two performs the DML operation to deposit the amount, and then returns a response.
  11. The Teller service commits the transaction only if both the requests, that is, the request to Department One and the request to Department Two, are executed successfully. In case of any failure, the Teller service calls rollback instead of commit. Teller tracks the commit transaction using the same GTRID that was used by Department One and Two.
  12. MicroTx Distributed Transactions coordinator prepares the participant service, Department One, to commit the transaction.
  13. MicroTx Distributed Transactions coordinator calls Department One. The participant microservice in turn uses the integrated MicroTx Distributed Transactions library to send a request to prepare the resource manager.
  14. MicroTx Distributed Transactions coordinator prepares the participant service, Department Two, to commit the transaction.
  15. Coordinator sends a request to Department Two. The participant microservice in turn uses the integrated MicroTx Distributed Transactions library to send a request to prepare the resource manager.
  16. The coordinator sends a commit request to the participant services after the prepare phase is completed successfully. The participant services in turn send a request to the resource manager using the integrated MicroTx Distributed Transactions library. The coordinator returns a response to the Teller service which completes the transaction.