2012-01-11 81 views
0

我的應用程序部署在具有2個節點的weblogic 9羣集環境中,並使用持久性提供程序toplink連接到MS SQL Server 2005。部署的應用程序是用Java編寫的。在weblogic集羣環境(羣集內的多個節點)上工作時行鎖定失敗

我的應用程序需要的服務請求的時候做簡單的操作:

  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(); 

看來,如果我啓動的節點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?

非常感謝

回答

0

都會收到第3步和完整,第二個事務要等到第一個提交它經歷雖然之前。

如果您沒有看到它,這很奇怪。你確定第123行存在嗎?他們是否連接到同一個數據庫,您的事務配置是否正確?如果你嘗試(updlock)它是否工作?這可能與您的數據庫配置方式有關,也許在數據庫shell中嘗試相同。

而不是選擇,你也可以嘗試更新行(設置一些列等於自己),這應該確保獲得行鎖。

0

從您的persistence.xml中您使用JTA事務,但是從您的代碼使用JPA EntityManager事務。你不能同時使用兩種,只能使用其中一種。

如果您使用的是MDB,則應該使用注入的JTA託管的EntityManager。您不應該使用JPA事務,並且MDB應該自動啓動/結束JTA事務。

我的猜測是,您還沒有設置「toplink.target-server」,您必須這樣做,才能在WLS上啓用JTA集成。我不確定TopLink Essentials是否提供了WLS服務器,因此您可能需要升級到EclipseLink。

如果要使用JPA EntityManager事務,請在persistence.xml中設置transaction-type =「RESOURCE_LOCAL」。

+0

非常感謝您的幫助! – 2012-02-14 10:05:55