2016-12-16 81 views
0

我不知道如果我理解正確的概念,JDBC自動提交和回滾

如果我有:

try{ 
    conn.setAutoCommit(false); 
    Statement st= conn.createStatement(); 

    // valid statement 
    String statement1 = ....; 
    st.executeUpdate(statement1) 

    // invalid statement that will cause an error 
    String statement2 = ....; 
    st.executeUpdate(statement2) 

}catch(SQLException e){ 
    // there was an error 
    conn.rollback(); 

都聲明拋棄?還是它只會忽略statement2和statement1?

+0

當您的問題是關於正常事務回滾(禁用自動提交)時,爲什麼您的標題爲「JDBC AutoCommit and Rollback」? –

回答

1

從Javadoc文檔Connection#rollback()

撤消在當前事務並釋放Connection當前對象持有的所有數據庫鎖的所有更改。只有在禁用自動提交模式時才應使用此方法。

這意味着的一切發生在你的包裝事務內部將被回滾。如果錯誤發生在第二次更新上,意味着第一次更新成功,那麼也許只有第一次更新需要被顛倒。

您向我們展示的交易允許您的兩個更新以原子方式發生或至少以這種方式出現給可能在數據庫中運行的所有線程。部分要求是整個交易成功或失敗。如果是後一種情況,則回滾是在數據庫未能在事務嘗試之前回到起點的情況下使用的回退。

-1

您提到的場景中需要的工作示例可在this的地方找到。

這裏是討論這種行爲的Oracle documentation

autocommit()設置爲false表示您作爲程序員想要根據DML查詢的結果來控制提交事務。

要回答你的問題,在你提到的情況下,沒有一個INSERT語句會成功。

希望你得到你想要的信息!

+0

這實際上並不是問題的答案(或者你依賴那些鏈接來爲你回答)。 –

+0

我已經提到這些鏈接來回答問題,而不是決定不復制粘貼文檔@MarkRotteveel中的內容! –

+0

可能是這樣,但是你不回答這個問題_「這兩個語句都被拋棄了嗎?還是隻忽略了statement2和statement1?」_ –