Код: Выделить всё
// Within a @Transactional(REQUIRED) block
Connection con = getConnection(...) (1)
// do some sql updates (2)
try {
// Start @Transactional(REQUIRES_NEW) block
Connection con2 = getConnection(...) (3)
// do some more sql updates (4)
throw new Exception();
// End REQUIRES_NEW block
} catch (Exception ignored) {
}
// End Required block
< /code>
Ожидается, что наш тестовый пример заканчивается тем, что обновления SQL из (2) были видны в базе данных, обновления SQL из (4) не видно, как соединение Con2 следует выполнять в рамках другой транзакции, которая должна была быть откатана обратно на исключение. Нет откатов. Судя по всему, CON и CON2 являются одним и тем же объектом или, по крайней мере, ссылкой на ту же основную транзакцию Wildfly. И только для ссылки: если все бобы и транзакции переключены на аннотации Джакарты, это работает. Блок представляет собой обратный вызов, выполненный в отдельном весеннем бобе, аннотированном с @transactional
Итак Наше предположение состоит в том, что (3) не знает о вновь начальной транзакции и дает нам внешний транзакцию. Итак, мы посмотрели на код, получающий транзакцию. Первоначально это был какой -то поиск с помощью javax.initialContext . Мы предположили, что поиск, связанный с пружиной, может сделать трюк и переключиться на jndidatasourcelookup из Spring, и когда это не сделало трюк, мы также поместили полученный DataSource через DataSourceUtils Класс с весны. < /p>
Что мы сделали неправильно? Как мы можем получить второе соединение, связанное с контекстом внутренней транзакции?
Подробнее здесь: https://stackoverflow.com/questions/794 ... ansactions