我的應用程序部署在具有2個節點的weblogic 9羣集環境中,並使用持久性提供程序toplink連接到MS SQL Server 2005。部署的應用程序是用Java編寫的。在weblogic集羣環境(羣集內的多個節點)上工作時行鎖定失敗
我的應用程序需要的服務請求的時候做簡單的操作:
- 開始交易
- 從表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();
看來,如果我啓動的節點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?
非常感謝
非常感謝您的幫助! – 2012-02-14 10:05:55