@Transactional не работает над данными JNDIJAVA

Программисты JAVA общаются здесь
Anonymous
@Transactional не работает над данными JNDI

Сообщение Anonymous »

У нас есть веб -приложение, работающее на дикой стадии, используя данные JNDI для обработки операций, связанных с базой данных. Во время операции по модернизации мы в настоящее время меняем EJBS на пружину в качестве первого шага, чтобы сделать приложение, способное работать на более простом контейнере сервлета, таким как Tomcat. /code> to @service и, очевидно, изменение аннотаций @TransActionAl из Annotations Jakarta на Annotations Spring , наше поведение транзакции внезапно нарушается. br /> Как часть теста, у нас есть испытательный приход, который примерно делает следующие < /p>

Код: Выделить всё

// 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 
. Мы видим, что это приводит к тому, что пружина, построенная вокруг сервиса, и мы можем видеть, что после завершения/прерывания кода коммит/откат выполняется на JbosswrappedDatasource.
Итак Наше предположение состоит в том, что (3) не знает о вновь начальной транзакции и дает нам внешний транзакцию. Итак, мы посмотрели на код, получающий транзакцию. Первоначально это был какой -то поиск с помощью javax.initialContext . Мы предположили, что поиск, связанный с пружиной, может сделать трюк и переключиться на jndidatasourcelookup из Spring, и когда это не сделало трюк, мы также поместили полученный DataSource через DataSourceUtils Класс с весны. < /p>
Что мы сделали неправильно? Как мы можем получить второе соединение, связанное с контекстом внутренней транзакции?

Подробнее здесь: https://stackoverflow.com/questions/794 ... atasources

Вернуться в «JAVA»