Transactions, Sub-Transactions and Transaction Groups

Here is a recent query from a developer that led to a nice succinct overview of transactions, sub-transactions and transaction groups by Arnošt Löbel.

This makes a change from the recent rash of monster posts.
The last ten posts were all rather overwhelming in size, and hopefully impressive in content as well.
From Aril 16 until 29, I posted a total of 26228 words, 245504 bytes.

So let’s keep this one short, sweet and to the point.

Question: When should I use a transaction group with transactions versus transaction with sub-transactions?

At first glance, it looks as if both can achieve the same result, but there must be some kind of difference, mustn’t there?

Answer: This question is actually covered at large in the API documentation for the respective classes.
Of course, you could write a whole book about the detailed usage of transaction phases (i.e. Transaction, Transaction groups, Sub-Transaction), if you wanted to, but the documentation already covers all the really necessary information.

Here is a brief summary:

  • A transaction is a phase that is needed to make modifications to a model. A transaction is undoable. Once committed, it appears on the undo/redo menu, where the end user can make it undone or later redone. Transactions cannot be nested, for only one client can modify the model at any given time.
  • A sub-transaction marks a phase within an open transaction. It is to control (if a control is needed) a set of modifications done in a transaction, meaning that the modification enclosed in a sub-transaction can be rolled back as if they have not happened. In a sense, it allows an application to go back to a certain point (the start of the sub-transaction) in a sequence of model changes. Sub-transactions can be nested. A sub-transaction cannot be undone/redone once committed.
  • A transaction group can control a set of transactions in the sense that even transaction that have already been successfully submitted can be rolled back if they were committed while inside an open transaction group. This give an application a way of undoing past transaction if some other transactions later (but still within the group) do not go as well as expected. For example, if three transactions are required (for whatever reason) to achieve something, and it is necessary to commit all three for the changes to make sense, the transactions could be controlled by a group. If the second or the third transaction fails, the whole group can be rolled back. Transaction groups can be nested, but they cannot be undone/redone, i.e. there is no trace of them in the undo/redo menu for the end user to see.

The

temporary transaction trick touch-up
describes
a scenario using a transaction group to enable a transaction to be committed, so the model is updated and the new state can be queried, and still enabling the whole action can be undone afterwards.

For more information on the transaction framework, please refer to Arnošt’s Autodesk University presentation

CP3426 Core Frameworks in the Revit API
.

Response: Thank you!
I use the temporary transaction trick quite a lot, so I’ll definitely start using transaction groups now as well.


Comments

3 responses to “Transactions, Sub-Transactions and Transaction Groups”

  1. Also note that TransactionGroup.Assimilate() will only add one entry to the Undo/Redo list (the group name) while TransactionGroup.Commit() will add one item to the Undo/Redo list for each Transaction in the group.

  2. Yes, that is how it appears, but it is not what happens technically. Transaction groups do not add anything to the Undo/Redo menu; only transactions can do that. So, if there are transactions in a group, they will all appear on the Undo list when they get committed. Then, when the group ends, it will either leave the items there in case the group gets committed, or it will remove (N-1) of them and merges their changes with the first transaction of the group, plus replaces the name of the one remaining item. This is just a technicality, but in case anyone wondered how it actually works, now he/she knows. :-)

  3. Makes sense, I never thought about it that deeply. Thanks Arnošt!

Leave a Reply

Discover more from Autodesk Developer Blog

Subscribe now to keep reading and get access to the full archive.

Continue reading