JDBC事務
阿新 • • 發佈:2021-01-20
技術標籤:Java
JDBC事務
嚴格來講,事務不是JDBC的技術而是資料庫的技術。
事務的概念
把連續執行的一系列SQL語句視為一個整體。
PS:這裡的SQL語句,主要是DML語句(增刪改),DQL用的不多
如何判斷是否是一個整體?
整體表示這一系列SQL語句要麼都執行成功,要麼都不執行。
public void preparedStatementBusiness() {
String sql1 = "UPDATE student SET age=age+10 WEHRE id=3";
String sql2 = "UPDATE student SET age=age+20 WEHRE id=3" ;
String sql3 = "UPDATE student SET age=age+30 WEHRE id=3";
Connection conn = JdbcUtil.getConnection();
PreparedStatement ps = null;
try {
ps=conn.prepareStatement(sql1);
ps.executeUpdate();
ps=conn.prepareStatement(sql2);
ps.execute();
ps=conn.prepareStatement(sql3);
ps. executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtil.close(conn, ps);
}
}
例如上面所示程式碼中執行的這三條SQL語句就不是一個整體,比如將sql2這個字串修改成錯誤的SQL語句,sql1語句依舊會修改資料庫的資料,而sql2會因為丟擲異常不執行。
事務的三個操作
- 開啟事務:取消自動提交事務
- 提交事務:使用commit來主動提交事務
- 回滾事務:如果出現異常,使用rollback將資料回滾到開始事務時
程式碼演示:
public void preparedStatementBusiness () {
String sql1 = "UPDATE student SET age=age+10 WEHRE id=3";
String sql2 = "UPDATE student SET age=age+20 WEHRE id=3";
String sql3 = "UPDATE student SET age=age+30 WEHRE id=3";
Connection conn = null;
PreparedStatement ps = null;
try {
conn = JdbcUtil.getConnection();
conn.setAutoCommit(false);// 開啟事務——取消自動提交
ps = conn.prepareStatement(sql1);
ps.executeUpdate();
ps = conn.prepareStatement(sql2);
ps.execute();
ps = conn.prepareStatement(sql3);
ps.executeUpdate();
conn.commit();// 提交事務
} catch (SQLException e) {
try {
conn.rollback();// 事務回滾
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
} finally {
JdbcUtil.close(conn, ps);
}
}