一、關於事務的基本知識
事務是什麼
- 事務通常用於操作數據庫,也稱數據庫事務,數據庫事務是由一系列的sql語句組成
事務的特點
- 事務中的sql語句,要麼都執行,要麼都不執行
JDBC的事務機制
- JDBC事務是自動提交的,什麼是自動提交呢?
- 自動提交就是事務的DML(增加、刪除、修改)sql語句,執行一次就提交一次結果
但在實際業務中,通過都是N條DML語句共同聯合完成的,必須保證在同一事務的DML語句同時完成或同時失敗,下面用例子說明
二、JDBC事務機制例子
簡單的業務場景
- 賬戶111給賬戶222轉錢
- 執行一個update語句,讓賬戶111從原有的10變成0
- 執行一個update語句,讓賬戶222從原有的0變成10
- 如果在這兩個update語句中間發生代碼異常,
- 那麼根據JDBC事務自動提交,兩個賬戶的錢都會變爲0
這種情況在現實生活中發生,那兩方不就虧大發了嘛,進一步說公司離倒閉就不遠了
三行代碼解決上述問題
//開啓事務,將自動提交改爲手動提交
conn.setAutoCommit(false);
//提交事務
conn.commit();
//回滾事務,如果代碼沒有執行commit方法,事務回滾到之前的狀態
conn.rollback();
三、代碼實現
public class JDBCTest11 {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
try{
//註冊驅動
Class.forName("com.mysql.jdbc.Driver");
//獲取連接
conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/selfproj?useUnicode=true&characterEncoding=utf8","root","123456");
//開啓事務
//將自動提交機制修改爲手動提交
conn.setAutoCommit(false);
//創建預編譯數據庫操作對象
String sql = "update t_act set balance = ? where actno=?";
ps=conn.prepareStatement(sql);
//給?佔位符傳值
ps.setDouble(1,0);
ps.setInt(2,111);
//1.執行第一個update語句
int count = ps.executeUpdate();
//這裏發生空指針異常
String s =null;
s.toString();
//給?佔位符傳值
ps.setDouble(1,10);
ps.setInt(2,222);
//2.執行第二個sql語句
count+= ps.executeUpdate();
System.out.println(count==2 ? "轉賬成功":"轉賬失敗");
//程序能夠走到這裏說明以上沒有異常,事務結束,手動提交數據
conn.commit();//提交事務
}catch (Exception e){
if (conn != null) {
try {
//回滾事務,如果代碼出現異常沒有執行commit方法,回滾事務
conn.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
e.printStackTrace();
}finally{
//釋放資源
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
附上sql腳本
drop table if exists t_act;
create table t_act(
actno int,
balance double(7,2)
);
insert into t_act(actno,balance) values(111,10);
insert into t_act(actno,balance) values(222,0);
commit;
select * from t_act
四、總結
java中只需要將自動提交事務改爲手動提交事務,如果出現代碼異常,就回滾到原有的狀態
小聲bb:原本以爲事務是一個高大上的東西,其實在之前自考就學習過,果然實踐纔是硬道理
對了到mybatis框架時會用到事務哦