筆記
事務:一個步驟包含多個操作,要麼同時成功,要麼同時失敗。例子:銀行轉賬,轉賬的人錢變少,另一個人的錢得變多,要麼同時成功,要麼同時失敗。
開啓事務:setAutoCommit(boolean autoCommit):調用該方法設置參數爲false即爲開啓成功
提交事務:commit
回滾事務:rollback()
package com.zqyzc.com;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import com.zqyzc.util.JDBCUtils;
/**
* 事務操作
* @author 92086
*
*/
public class JDBCTest1 {
public static void main(String[] args) {
// 1獲取鏈接
Connection conn = null;
PreparedStatement pstmt1 = null;
PreparedStatement pstmt2 = null;
try {
//1、獲取鏈接
conn = JDBCUtils.getConnection();
//2、開啓事務
conn.setAutoCommit(false);
//2、定義sql
//2.1 張三 +500
String sql1 = "update account set balance = balance + ? where id = ?";
//2.2李四 -500
String sql2 = "update account set balance = balance - ? where id = ?";
//3、獲取執行sql對象
pstmt1 = conn.prepareStatement(sql1);
pstmt2 = conn.prepareStatement(sql2);
//4、設置參數
pstmt1.setDouble(1, 500);
pstmt1.setDouble(2, 1);
pstmt2.setDouble(1, 500);
pstmt2.setDouble(2, 2);
//5、執行sql
pstmt1.executeUpdate();
pstmt2.executeUpdate();
//當所以sql都執行完,提交事務
conn.commit();
} catch (Exception e) {
// TODO Auto-generated catch block
//事務的會滾操作
try {
if(conn!=null)
conn.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
e.printStackTrace();
}finally{
JDBCUtils.close(pstmt1, conn);
JDBCUtils.close(pstmt2, null);
}
}
}
事務在獲取鏈接後開啓,在執行完所有的sql後關閉。當出現異常,無論什麼異常,事務需要回滾
執行前:
執行後