Description
I've come across a case where a transaction needs to be shared across multiple systems. If we wrap the REST API we can easily achieve this by setting the x-arango-trx-id
header. However, we would like to be able receive transaction IDs on both ends and continue the transaction seamlessly using the python-arango interface, instead of crudely performing raw queries against /_cursor
.
I've come up with the following hack, which does work, but given that _executor
is private, and _executor.id
specifically doesn't have a setter, I'm guessing there may be a reason it's discouraged:
from arango.database import TransactionDatabase
from arango.client import ArangoClient
def continue_transaction(db: StandardDatabase, transaction_id):
trx = TransactionDatabase(connection=deepcopy(db.conn))
trx._executor._id = transaction_id
return trx
db = ArangoClient(...).db(...)
trx = continue_transaction(db=db, transaction_id="1234")
trx.collection("vertex").insert({"_key": "test"})
trx.commit_transaction() # Alternatively, don't commit here and let the client who provided the transaction commit it themselves.
Would it make sense to support something like this directly? It seems to me like a reasonable use-case. If so, I'm happy to take a stab at developing a PR for this myself.