看板 java 關於我們 聯絡資訊
以下是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
luoqr: 補充 JBOSS EAP6.3 08/12 23:20
luoqr: JPA 應該是用 JBOSS 內建 hibernate 08/13 08:32
luoqr: DB是 MySQL innodb 08/13 08:33
luoqr: Query q = em.createNativeQuery("set session innodb_lock 08/13 08:42
luoqr: _wait_timeout=2); q.executeUpdate(); 08/13 08:42
luoqr: 最後用這招竟然有效 = =" 08/13 08:42
luoqr: 又自問自答了...XD 08/13 09:21