Как переопределить изоляцию транзакций в Spring с WebSphere и DB2 - PullRequest
0 голосов
/ 25 марта 2019

Лучший способ переопределить изоляцию транзакций весной с WebSphere и DB2

Привет все,

Кажется, что WebSphere не позволяет Spring программно переопределить уровень изоляции транзакций, настроенный на сервере.xml (в источнике данных WebSphere).Итак, каков наилучший вариант, если в такой ситуации необходимо переопределить изоляцию транзакции?

Допустим, по умолчанию для уровня изоляции установлено значение REPITABLE_READ, существует метод ... огромный метод с большим количеством операций выбора и обновления парыв конце.Давайте представим, что нет никакого способа реорганизовать этот метод в любом случае, но мы знаем, что где-то в середине этого метода есть пара селекторов, которые можно использовать вне изоляции RR, поскольку они огромны, со многими объединениями, и пока мы выполняем эти селекты, мыблокирует строки в базе данных для другой транзакции.Проблема заключается в том, что извлечение их в отдельный метод, аннотированный @Transactional (изоляция = READ_COMMITED), не изменит ситуацию, так как эта изоляция игнорируется WebSphere или драйвером базы данных.

Итак, можно ли вывести Connection из системы?Hibernate Session и изменить уровень изоляции на READ_COMMITED точно в требуемом месте (вокруг этих двух методов) и вернуть его обратно в REPITABLE_READ в конце метода?Я предполагаю, что Соединение используется для каждого потока, и не должно быть никаких побочных эффектов, изменяющих уровень изоляции на соединении?

Или лучше добавить выделенный источник данных WebSphere с преднамеренно настроенным уровнем изоляции в READ_COMMITED и создать аспект с аннотацией, который позволил бы заменить источник данных для этих двух методов?

Кроме того, было бы очень благодарно, если бы кто-нибудь мог объяснить, как именно механизм переопределения изоляции работает на уровне @Transaction и сколько уровней изоляции возможно при взаимодействии Spring + Database?Или, может быть, у кого-то есть хорошая ссылка с этим ответом.

Спасибо всем!

1 Ответ

0 голосов
/ 03 апреля 2019

Кажется, что нет способа изменить уровень изоляции, который установлен на DataSource в server.xml с помощью аннотации @Transactional. Хотя можно перехватывать вызов метода DAO по аспектам и устанавливать уровень изоляции непосредственно в соединении с помощью setTransactionIsolation (), после запуска транзакции невозможно вернуть обратно изоляцию, поскольку она пытается установить уровень изоляции в разделяемом соединении запрещен запуск глобальной транзакции ...

Возможные решения - добавьте отдельный источник данных с изолированной фиксацией и используйте его там, где это необходимо. Другое решение - в DB2 можно указать условие уровня изоляции непосредственно в операторе SELECT: WITH UR, CS, RS, RR

Пример: ВЫБРАТЬ имя из городов с CS;

...