2014-10-30 54 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