JDBC程序中當一個連接對象被創建時,默認情況下是自動提交事務:每執行一個SQL語句時,如果執行成功,就會向數據庫自動提交而不能回滾。
JDBC事務為了讓多個SQL語句作為一個事務被執行,手動設置提交事務與結束事務方法:
調用Connection對象的setAutoCommit(false);//取消自動提交事務
在所有SQL語句執行成功后,使用Connection對象的commit()方法提交事務
若中途出現某個SQL語句執行不成功,則使用Connection對象的Rollback()方法回滾事務//可以使用try/catch/finally判斷事務是否提交還是回滾
若Connection沒有關閉,則需要恢復自動提交事務狀態:setAutoCommit(true)
/*
*將一個轉賬操作SQL語句使用手動事務提交方式
*/
//讀取配置文件參數信息
Properties properties=new Properties();
properties.load(new File("jdbc.properties"));
String driver=properties.getProperty("driver");
String url=properties.getProperty("url");
String user=properties.getProperty("user");
String pas=properties.getProperty("password");
//創建驅動
Class.forName(driver);
//驅動連接
Connection connection=DriverManager.getConnection(url,user,pas);
PreparedStatement statement=null;
try{
//取消事務自動提交
connection.setAutoCommit(false);
//編寫並執行SQL語句
String sql=“update Account set balance=? where username=?”;
statement=new PreparedStatement(sql);
statement.setDouble(1,10000);//剩余金額為10000
statement.setString(2,"tom");//轉賬人姓名
statement.executeUpdate();//執行轉賬sql操作
statement.setDouble(1,30000);//剩余金額為30000
statement.setString(2,"tony");//轉賬人姓名
statement.executeUpdate();//執行被轉帳sql操作
//若無異常,則事務成功提交
connection.commit()
}catch(Exception e){
connection.Rollback();//若產生異常,則事務回滾
}finally{//最后一定執行關閉連接
statement.close();connection.close();
}
