Try turning up the debug level so that you can check the timestamps of when the transaction is started and ended.to ensure that you aren't exceeding the transaction timeout.
Odds are something you call is terminating the transaction. If is was a background timeout the tx would still be associated with the Thread and you'd get an illegal state - tx aborted from the commit() instead of a notx.
Our timeout (transactionTimeout) is 900 seconds.
All procedure is executed for 8 seconds.
We haven't found warn messages in log files about exceeding the transaction timeout.
Did you get to the bottom of this? Mikes suggestion of turning up the debug level would help you spot if Jonathans hunch was right that something you were calling in "// ... some changes of recipient" completed the transaction as you would spot that in the log too.