Здравствуйте, sgp, Вы писали:
sgp>Уровень изоляции SERIALIZABLE не допускает одновременное изменение одного поля одной записи двумя конкурирующими транзакциями.
Это верно.
sgp>Если такое случается, то одна из транзакций должна быть откачена. В моем случае используется Oracle. Абсолютно точно так ведет себя Postgres и Sybase. Похожим образом должны вести себя и другие СУБД.
А это верно лишь от части. Если БД удалось "сериализовать" транзакции — выполнить их последовательно, то ничего откатывать и не нужно.
sgp>Если я ручками открываю 2 сессии к БД и в пошаговом режиме выполняю чтение и обновление записей, то почему я должен сомневаться в том, что транзакции конкурентны?
Сложный вопрос. Но исключать такого хода событий тоже нельзя, иначе поведение Spring шло бы в разрез с мануалом. Поэтому я полагаю что БД разрулила обе транзакции.
Я советую или включить логи на стороне БД или использовать логгирование в драйвере. Могу посоветовать библиотечку com.googlecode.usc.jdbcdslog. Можно будет отследить всё, что происходит с транзакциями, откатами и т.д.
Даже в случае с вложенными транзакциями при откате внешней транзакции должны откатываться внутренние. Поведение в вашем примере ненормально и скорее всего проблема в настройке спринга.
Вложенные транзакции уж точно не должны применяться по умолчанию в Spring Data. Это абсолютно ненужный оверхед. Да и в принципе штука достаточно экзотическая.