С коллегой сегодня раскопали занятный глюк: при отладке кода разноски произвольным, казалось бы, образом откатывались транзакции. Поскольку в коде были вложенные транзакции, выглядело это еще более странно: всплывает отладчик, показывает ttsLevel 2, потом через пару шагов отладки - уже 0, потом в коде идет ttsbegin, ttsLevel увеличивается до 1, потом - опять 0. Разобраться помогла трассировка всего этого безобразия - в ходе ее разбора выяснилось, что транзакция откатывалась, когда отладчик вызывал метод toString(), чтобы показать описание объекта в окне Watch. Еще занятно то, что отладчик не может "остановиться", если исключение возникает в ходе того, как он "всплывает" и подготавливает данные для отображения в своем окне. Как результат, отловить такую ошибку в самом отладчике не получалось - никаких ошибок со стеками вызова не показывалось. Так что надо быть очень аккуратным при перекрытии метода toString() и реализации в нем какой-то нетривиальной логики