Может ли приложение изменить уровень изоляции для каждой отдельной транзакции в комбинации WebSphere и DB2 - PullRequest
4 голосов
/ 24 декабря 2011

У меня есть приложение, работающее на сервере приложений WebSphere (7.0.0.19), использующее базу данных DB2 (9.5).У меня сложилось впечатление, что сервер приложений или база данных игнорирует уровень изоляции, установленный в приложении (в коде Java).Приложение использует получает соединения с сервера приложений, оно использует менеджер транзакций с сервера приложений.

Я не нашел четкого ответа (или подтверждения) ни в руководствах, ни в Интернете.Я нашел некоторые указания, предложения, инсинуации, но нет четких ответов.Некоторый мониторинг швов базы данных, чтобы доказать это.

Может ли кто-нибудь признать это поведение?Можно ли это изменить с помощью конфигурации?

Ответы [ 2 ]

2 голосов
/ 27 декабря 2011

Поскольку источник данных управляется сервером приложений (а WebSphere является полнофункциональной реализацией Java EE), здесь на самом деле применяется спецификация JCA. Раздел 7.9 JCA 1.5 накладывает следующие ограничения на способность приложения изменять уровень изоляции транзакции:

Если соединение помечено как общедоступное, оно должно быть прозрачным для приложения независимо от того, используется одно общедоступное соединение или нет. Приложение не должно делать предположений об одном используемом общем подключении и, следовательно, должно использовать это подключение совместно.

Однако компонент приложения J2EE, который намеревается использовать соединение без общего доступа, должен оставить подсказку по развертыванию на этот счет, что помешает общему соединению контейнера. Примеры непостоянного использования соединения включают изменение атрибутов безопасности, уровней изоляции, настроек символов и конфигурации локализации.

Подводя итог: в общем, ваше приложение не должно пытаться изменить уровень изоляции, если ссылка на ресурс настраивает соединение как совместное. Если вы посмотрите на Требования для установки уровней изоляции доступа к данным в инфоцентре WAS, вы также найдете следующее утверждение:

Попытка напрямую установить уровень изоляции с помощью метода setTransactionIsolation () для разделяемого соединения, которое выполняется в глобальной транзакции, недопустима. Чтобы использовать другой уровень изоляции для соединений, необходимо указать другую ссылку на ресурс.

С другой стороны, в разделе 7.9.1 спецификации JCA 1.5 описаны сценарии, в которых сервер приложений может по-прежнему разрешать приложению изменять уровень изоляции, даже если соединение является разделяемым. В основном это относится к сценариям, в которых соединение настроено как совместное, но в котором оно фактически не используется (поскольку нет необходимости совместно использовать соединение между несколькими компонентами).

В разделе Расширения API доступа к данным в инфоцентре предполагается, что WebSphere поддерживает это:

приложения [...] не могут изменять свойства разделяемого соединения после выполнения запроса на соединение, если для этого соединения существуют другие дескрипторы. (Если с соединением не связаны никакие другие маркеры, свойства соединения могут быть изменены.)

Следовательно, вы должны иметь возможность использовать setTransactionIsolation () для изменения уровня изоляции в определенных сценариях, но это зависит от того, как ваше приложение использует соединение.

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

Обратите внимание, что есть несколько способов избежать всех этих осложнений (которые могут или не могут быть применимы в вашем случае):

  • Вместо использования setTransactionIsolation () настройте соответствующий уровень изоляции для ссылки на ресурс и при необходимости используйте несколько ссылок на ресурсы.
  • Используйте специальный API-интерфейс WSDataSource для WebSphere, чтобы указать ожидаемый уровень изоляции перед установлением соединения.
  • Измените свой SQL, чтобы изменить уровень изоляции для каждого запроса (например, используйте WITH UR).
0 голосов
/ 01 октября 2012

http://www.ibm.com/developerworks/java/library/j-isolation/index.html это актуально

применимо также обсуждение транзакций ejb и уровня изоляции

http://java.boot.by/ibm-287/ch05.html

...