Ошибка блокировки строк при работе в среде кластера weblogic (несколько узлов внутри кластера) - PullRequest
0 голосов
/ 11 января 2012

Мое приложение развернуто в кластерной среде weblogic 9 с двумя узлами и подключается к MS SQL Server 2005 с помощью toplink поставщика сохраняемости.Развернутое приложение написано на Java.

Моему приложению нужно выполнить простую операцию при обслуживании запроса A:

  1. начать транзакцию
  2. Выбрать записи из таблицы A иустановить на них блокировку строк
  3. обработать их
  4. обновить таблицу A с результатом.
  5. завершить транзакцию

код Java похож на:

EntityManager em =Persistence.createEntityManagerFactory("NewPersistenceLevelPU").createEntityManager;
EntityTransaction transaction = em.getTransaction();
transaction.begin();

// step 2
em.createNativeQuery("select * from Table_A with(updlock, rowlock) where id = 123");
List<List<Object>> results = (List<List<Object>>) query.getResultList();

//step 3
SomeOperation(results);

// step 4, using the results from step 3
em.createNativeQuery("update Table_A set Column A = 'something' where id = 123");

// step 4
em.flush();
transaction.commit();

Похоже, что если я запущу запрос A на узле 1 и узле 2 одновременно, оба узла смогут перейти к шагу 3, что не соответствует моим ожиданиям.Как я ожидаю, база данных должна быть уже заблокирована узлом (например, узлом 1), сначала проходит шаг 2 (потому что with(updlock, rowlock)), а последующий должен быть заблокирован, пока первая транзакция не будет зафиксирована.

Могу ли я узнать, если я что-то не так?Большое спасибо за помощь


Спасибо за ваш ответ.После еще одного исследования я обнаружил следующее:

  1. Наш метод фактически вызывается MDB
  2. persistence.xml следующим образом

    <?xml version="1.0" encoding="UTF-8"?>
    <persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
    <persistence-unit name="NewPersistenceLevelPU" transaction-type="JTA">
    <provider>oracle.toplink.essentials.PersistenceProvider</provider>
        <jta-data-source>TestDB</jta-data-source>
            <properties>
                <property name="toplink.cache.type.default" value="" />
            </properties>
    </persistence-unit>
    </persistence>
    

Теперь мне интересно: 1. Это диспетчер транзакций, управляемый приложением или контейнером?2. в обоих случаях, как я могу обработать транзакцию в приложении?использовать UserTransaction или EntityTransaction?

Большое спасибо

Ответы [ 2 ]

0 голосов
/ 18 января 2012

Из вашего файла persistence.xml вы используете транзакции JTA, но из своего кода вы используете транзакции JPA EntityManager.Вы не можете использовать оба, только один или другой.

Если вы используете MDB, вы должны использовать введенный JTA управляемый EntityManager, управляемый JTA.Вы не должны использовать транзакции JPA, а MDB должен автоматически запускать / завершать транзакцию JTA.

Я предполагаю, что вы не установили "toplink.target-server", который вы должны сделать, чтобы включить интеграцию JTAпо WLS.Я не уверен, что TopLink Essentials поставил WLS-сервер, поэтому вы можете захотеть обновить его до EclipseLink.

Если вы хотите использовать транзакции JPA EntityManager, то установите значение транзакции-типа = "RESOURCE_LOCAL" в файле persistence.xml.

0 голосов
/ 12 января 2012

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

Странно, если вы этого не видите. Вы уверены, что строка 123 существует? Они подключаются к одной базе данных, правильно ли настроены транзакции? Если вы попробуете только с (updlock) это работает? Это может быть связано с тем, как настроена ваша база данных, возможно, попробуйте то же самое в оболочке базы данных.

Вместо выбора вы также можете попробовать обновить строку (установить некоторый столбец равным самому себе), это должно обеспечить получение блокировки строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...