Мое приложение развернуто в кластерной среде weblogic 9 с двумя узлами и подключается к MS SQL Server 2005 с помощью toplink поставщика сохраняемости.Развернутое приложение написано на Java.
Моему приложению нужно выполнить простую операцию при обслуживании запроса A:
- начать транзакцию
- Выбрать записи из таблицы A иустановить на них блокировку строк
- обработать их
- обновить таблицу A с результатом.
- завершить транзакцию
код 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)
), а последующий должен быть заблокирован, пока первая транзакция не будет зафиксирована.
Могу ли я узнать, если я что-то не так?Большое спасибо за помощь
Спасибо за ваш ответ.После еще одного исследования я обнаружил следующее:
- Наш метод фактически вызывается MDB
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?
Большое спасибо