[J2EE] JPA PESSIMISTIC_WRITE

看板java作者 (.....)時間10年前 (2015/08/12 14:42), 編輯推噓0(007)
留言7則, 1人參與, 最新討論串1/2 (看更多)
以下是EJB的兩個function,我用 client 產生兩個thread分別呼叫 EJB 的 test1() 和 test2(): 照理來說,test1()中把 u lock 起來後,睡了十秒的期間執行了 test2() 而 test2() 理論上想要把同一筆資料再鎖起來時應該要發生 LockTimeoutException 才對啊? 可是我試的結果卻是 test2() 會停在那等十秒過了,然後 test1() commit 接著再從 after lock2 做下去然後 commit? 請問有高手用過 PESSIMISTIC_WRITE 嗎? 另外設定了 javax.persistence.lock.timeout 好像也沒屁用 @@ 不知道是不是我用錯了什麼? client 端: Thread t1: ejb.test1() Thread t2: ejb.test2() 呼叫程序: t1.start(); Thread.sleep(1000) ; t2.start(); @Override @TransactionAttribute(TransactionAttributeType.REQUIRED) public void test1() { User u = em.find(User.class, 1); System.out.println("lock1"); em.lock(u, LockModeType.PESSIMISTIC_WRITE); System.out.println("after lock1"); sleep(10000) ; u.setOrders("X"); System.out.println("update X"); } @Override @TransactionAttribute(TransactionAttributeType.REQUIRED) public void test2() { User u = em.find(User.class, 1); Map<String,Object> p = new HashMap<String,Object>(); p.put("javax.persistence.lock.timeout", 1000); System.out.println("lock2"); em.lock(u, LockModeType.PESSIMISTIC_WRITE,p); System.out.println("after lock2"); u.setOrders("Y"); System.out.println("update Y"); } -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.225.192.85 ※ 文章網址: https://www.ptt.cc/bbs/java/M.1439390532.A.784.html

08/12 23:20, , 1F
補充 JBOSS EAP6.3
08/12 23:20, 1F

08/13 08:32, , 2F
JPA 應該是用 JBOSS 內建 hibernate
08/13 08:32, 2F

08/13 08:33, , 3F
DB是 MySQL innodb
08/13 08:33, 3F

08/13 08:42, , 4F
Query q = em.createNativeQuery("set session innodb_lock
08/13 08:42, 4F

08/13 08:42, , 5F
_wait_timeout=2); q.executeUpdate();
08/13 08:42, 5F

08/13 08:42, , 6F
最後用這招竟然有效 = ="
08/13 08:42, 6F

08/13 09:21, , 7F
又自問自答了...XD
08/13 09:21, 7F
文章代碼(AID): #1Lorj4U4 (java)
討論串 (同標題文章)
以下文章回應了本文
1
1
完整討論串 (本文為第 1 之 2 篇):
1
1
0
7
10年前, 2015/08/12 14:42
文章代碼(AID): #1Lorj4U4 (java)