2014-10-30 97 views
2

是否使用JDBC確定我未提交活動事務? 我想確保所有事務都在Connection.close()之前被提交或回滾。JDBC確定活動事務

+0

相似但不相同的問題,也許它不會幫助你:http://stackoverflow.com/questions/1299694/oracle-how-to-find-out-if-there-is-a-transaction-正在等待 – 2014-10-30 12:21:30

+0

如何在您創建並使用您的代碼的連接上進行活動事務?你是否分享線程之間的連接? – beny23 2014-11-01 11:31:16

+0

測試需要。檢查交易是否已結束。 – 2014-11-02 19:41:18

回答

1

有沒有標準的JDBC方法做你想要什麼。但是,如果你想確保所有事務的提交/的Connection.close()之前rollbacked,你可以這樣做:

Connection conn = null; 

try { 
    conn = ...; 
    conn.setAutoCommit(false); 

    // do stuff 

    // commit only if everything is successful 
    conn.commit(); 
} 
catch (SomeException e) { 
    // log exceptions 
} 
finally { 
    if (conn != null) { 
     /* ALWAYS rollback before closing the connection 
     * if there's any caught/uncaught exception, the transaction will be rolled back 
     * if everything is successful/commit is successful, the rollback will have no effect 
     */ 
     try { 
      conn.rollback(); 
     } 
     catch (SQLException e) {} 

     try { 
      conn.close(); 
     } 
     catch (SQLException e) {} 
    } 
} 

這比回滾只有當有一個例外(catch塊)更好,因爲,如果有任何未捕獲的異常:

  • 回滾()不會被調用
  • 的Connection.close,同時有一個活動的事務,會發生什麼活動事務是實現特定的()將被調用。見Bogdan Calmac's answer
+0

「沒有標準的JDBC方法來執行您想要的操作。」 - 這是答案。謝謝。 – 2014-11-02 19:42:59

0

您可以查看Oracle提供的V$TRANSACTION視圖。

SELECT 
    s.osuser, vp.spid as os_pid, S.BLOCKING_SESSION blocker, 
    S.SID, S.SERIAL#, S.USERNAME, S.MACHINE, 
    Q.SQL_FULLTEXT cur_sql, PQ.SQL_FULLTEXT prev_sql, 
    vt.used_urec, vt.start_date 
FROM 
    v$session S 
    LEFT JOIN v$sqlarea Q on S.SQL_ID = Q.SQL_ID 
    LEFT JOIN v$sqlarea PQ on S.PREV_SQL_ID = PQ.SQL_ID 
    LEFT JOIN v$process vp on s.paddr = vp.addr 
    LEFT JOIN v$transaction vt on s.saddr = vt.ses_addr 
WHERE 
    vt.start_date < SYSDATE - (5/1440) 
-- AND 
-- s.machine = 'machine.name' 
ORDER BY 
    S.SID 
; 

查詢來源:What I Learned Today

+0

謝謝。但我想找到獨立於DBMS的方式。 – 2014-10-30 18:07:48