簡體   English   中英

什么時候應該調用connection.rollback()方法?

[英]When should we call connection.rollback() method?

請告訴我們何時需要調用connection.rollback()方法;

try{
  connection = getConnection();
  connection.setAutoCommit(false);
  pstmt1 = connection.preparedstatement ( ... );
  ...
  pstt1.executeUpdate();
  pstmt2 = connection.preparedstatement ( ... );
  ...
  pstt2.executeUpdate();
  connection.commit();
}catch ( Exception sqe ) {  sqe.printStacktrace();
}finally {
  closeQuitely ( pstmt1 );
  closeQuitely ( pstmt2 );
  closeQuitely ( connection );
}

在上面的代碼中我們沒有使用connection.rollback(),但是如果發生了一些異常,即使這樣一切都會正常工作[我猜],cos連接已經在autoCommit = false模式下設置了。

那么當我們需要使用這種方法時可能出現的情況。 請發布示例。

當您關閉連接時,您的交易將被終止。 大多數DBMS會回滾你的交易,因為他們不知道在什么情況下連接被終止(可能你的程序被殺了?)。 因此,如果您已經提交,則回滾將不執行任何操作。

另一方面,如果您正在使用Connection-Pooling,當您關閉連接時,Pool Manager會攔截它,並且可能(希望)回滾連接並保持連接打開。

在catch子句內部甚至在finally子句中回滾是一種很好的做法。 提交后執行不必要的回滾通常沒有壞處。

順便說一句,如果您使用Postgres, 在開始確保重置事務開始時間之前回滾是個好主意。 那是因為Postgres將current_timestamp值保存到事務開始的時間,如果你使用池化連接,這可能是很久以前的事了!

在例外情況下,您的交易未得到解決。 最終會超時,正如你所說它會回滾。 但在此之前(可能是幾分鍾),您的交易所持有的所有鎖都將被保留。 連接無法實現您可能不只是commit()。 像這樣長時間持有鎖是非常適合並發的。

將回滾添加到例外情況。

看來關閉連接也會終止轉換。 使用簡單JDBC時,但是在應用程序服務器中實現的連接池存在時,關閉連接的語義為“返回池” 連接池將保留連接與當前事務的關聯。 如果稍后在您的代碼中,仍然在同一事務的范圍內,您要求連接,則池將返回相同的連接。 這對於編寫moular應用程序確實非常方便,但是你不能假設關閉連接來解決事務。

begin tran

// call a method
    get connection

    work

    close connection

// call another method

    get connection  // you get the **same** connection still associated with the tran

    work

    close connection

commit

如果在未提交的情況下關閉連接,則將回滾事務。 如果您正在使用連接池,它可能正在為您做這件事。

當您遇到不會導致異常但仍然不想提交的條件時,顯式回滾可能更合適。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM