This exception is thrown when accessing a transactional object in a transaction that has already been marked as rollback only. The exact scenario when this exception is thrown is as follows:
- A transaction Ta accesses a transactional object (for read or write), and finds that it is conflicting with another transaction, Tb, that has accessed that object previously
- based on a heuristic one of the transactions is chosen as the victim and marked as rollback.
- if the victim is Ta (i.e., the transaction that has run into the conflict) then a TransactionConflictException will be thrown, and Ta will be automatically rolled back.
- if the victim is Tb, then Tb is merely marked as rollback only and Ta continues its execution normally
- when later Tb wakes up and attempts to access a transactional object (or attempt to commit) it will receive a TransactionAlreadyMarkedAsRollback exception. Tb will then be rolled back.