JDBC事務支持
JDBC連接的事務支持由Connection對象提供,且默認自動提交,即默認事務是關閉的狀態。也就是說,SQL語句執行將會立即提交至數據庫,永久生效。
JDBC中關於事務的操作:
conn.setAutoCommit(false); //關閉自動提交,開啟事務
/*下面倆需要在開啟事務之后才能使用*/
conn.commit(); //提交事務
conn.rollback(); //回滾事務
需要注意的是:當遇到一個未處理的SQLException
的異常時,系統會非正常退出,事務會自動回滾。但如果顯式捕捉該異常,則需要顯式地回滾事務。
try-with-resources
Java7增強的try語句的功能,保證那些實現Closeable接口的實現類能夠自動關閉資源,不用顯示的finally關閉資源。
細節可參考參考:JDK7的try-with-resource方式的使用
package cn.my.jdbcTransaction;
import cn.my.jdbcPra.util.JDBCUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
/**
* @auther Summerday
* JDBC的事務支持
*/
public class JDBCDemo {
public static void main(String[] args) {
//獲取連接
try (Connection conn = JDBCUtils.getConnection()) {
//關閉自動默認提交,開啟事務
conn.setAutoCommit(false);
//定義sql
//-500
String sql1 = "update account set balance = balance - ? where id = ?";
//+500
String sql2 = "update account set balance = balance + ? where id = ?";
//執行sql對象的prs
try (PreparedStatement prs1 = conn.prepareStatement(sql1);
PreparedStatement prs2 = conn.prepareStatement(sql2)) {
//設置參數
prs1.setDouble(1, 500);
prs1.setInt(2, 1);
prs2.setDouble(1, 500);
prs2.setInt(2, 2);
//執行sql1語句
prs1.executeUpdate();
//執行sql2語句
prs2.executeUpdate();
} catch (Exception e) {
System.out.println("roll back");
conn.rollback();
}
//提交事務
conn.commit();
System.out.println("commit!");
} catch (Exception e) {
e.printStackTrace();
}
}
}