Инструкции WebSphere insert / update с SQL-СЕРВЕРОМ зависают при распространении REQUIRE_NEW

#websphere

#websphere

Вопрос:

Мы столкнулись с проблемой в нашем пакетном приложении spring при развертывании приложения на WebSphere.

Пример: Один класс содержит метод parent(), а второй класс содержит метод child(), где дочерний метод требует новой транзакции. После выполнения методов при фиксации транзакции процедура фиксации зависает, и дальше ничего не происходит.

 @Transactional //using current transaction
public void parent(){
    child();
}

@Transactional(propagation=REQUIRES_NEW) //creates new transaction
public void child(){
//Database save statements including update, insert and deletes
}
  

Эта проблема сохраняется только в WebSphere, и код отлично работает на нашем локальном компьютере, где мы используем tomcat в качестве веб-контейнера.

WebSphere logs / stacktrace показывает, что подготовленная инструкция WebSphere продолжает ожидать ответа от базы данных. В то же время обновление и вставки заблокированы для затронутых таблиц, т. Е. если мы запускаем запрос insert или update вручную для затронутой таблицы, запрос не выполняется.

Мы используем Spring JPA для сохранения данных и Spring’s JpaTransactionManager для управления транзакциями и базой данных MSSQLServer.

Это из-за того, что WebSphere не поддерживает создание новой транзакции из существующей транзакции?

Ответ №1:

Да, описываемый вами шаблон поддерживается WebSphere Application Server. Учитывая, что это касалось заблокированных записей в базе данных, возможно, вы столкнулись с различием между серверами приложений, на которых уровень изоляции транзакций используется по умолчанию. В WebSphere Application Server по умолчанию используется java.sql.Connection.TRANSACTION_REPEATABLE_READ для SQL Server, тогда как я думаю, что в большинстве других случаев вы получаете значение java.sql.Connection по умолчанию.TRANSACTION_READ_COMMITTED (меньше блокировки). Если проблема связана со значением по умолчанию, вы можете изменить его в конфигурации источника данных.

Если вы используете WebSphere Application Server Liberty, то уровень изоляции по умолчанию можно настроить в server.xml в качестве свойства элемента DataSource, например, так,

 <dataSource isolationLevel="TRANSACTION_READ_COMMITTED" jndiName=...
  

Если вы используете WebSphere Application Server традиционно, то уровень изоляции по умолчанию может быть настроен как пользовательское свойство webSphereDefaultIsolationLevel, которое может быть установлено на числовое значение константы уровня изоляции в java.sql.Connection (значение для TRANSACTION_READ_COMMITTED равно 2).
Смотрите эту связанную статью о том, как это сделать с помощью консоли администратора.

Комментарии:

1. Спасибо, изменение уровня изоляции по умолчанию решило проблему.