Actually, Jeremy's answer is not entirely correct. The DocumentChanged event is to notify about transactions that has just ended. There is no indication of a transaction started, however.
The TransactionStatus property of a transaction is about the status of each and every one transaction object. Naturally, there can be many transaction instances in existence at the same time (owned by different applications or even by the same application), but only one of the object in each document would have its status equal to "Started" and that one object does not at all have to be yours. (I hope it make sense what I am saying.)
So, the only way to know whether a document is currently in a transaction or not is to test whether the document is "modifiable"; there is a method for that: Document.IsModifiable. If the value is True, the document can be currently modified, thus there must be an open transaction in it. However, keep in mind that a document can have an open transaction and yet not be modifiable. It happens when a document is in a read-only state (for whatever reason). There is a property for that too: Document.IsReadOnly. So, to sum it up, one can make changes in a document only if the document is modifiable and is not read-only.
That being said, it is for the best if each piece of code (method, subroutine, etc.) "knows" whether or not is supposed to be run when a document is modifiable or not. That should come with each method's contract. For example, external commands get invoked only when there is no transaction in the active document. Also events get raised only when there is no transaction in the document the event is about. On the other hand, dynamic updaters get invoked only when there is a transaction open in the document. Etc.
Arnošt
Arnošt Löbel