mysql學習16 ( JDBC操作事務 )
阿新 • • 發佈:2022-03-20
-
JDBC操作事務:
-
事務:要麼都成功,要麼都失敗;
-
ACID原則:
-
原子性:要麼都完成,要麼都不完成
-
一致性:總數不變
-
隔離性:多個程序互不干擾
-
永續性:一旦提交不可逆,持久化到資料庫
-
-
隔離性會產生問題:
-
髒讀:一個事務讀取了另一個沒有提交的事務;
-
-
幻讀:在一個事務內,讀取到了別人插入的資料,導致前後讀取出來的結果不一樣(讀者讀者變多了)
-
-
-
程式碼案例:
-
開啟事務;
-
一組業務執行完畢,提交事務;
-
可以在catch語句中,顯式定義回滾語句,但是預設就會回滾;
/**
* 測試JDBC操作事務:
*
*/
public class TestDemo01 {
public static void main(String[] args) {
Connection conn =null;
PreparedStatement st=null;
ResultSet rs=null;
try {
conn= JdbcUtils.getConnection();//獲取連線
/**
* 操作事務:
* 1,關閉資料庫的自動提交功能;
* 2,業務完畢,提交事務
* 3,如果失敗,就回滾事務
*/
conn.setAutoCommit(false);//1,關閉資料庫的自動提交功能;會自動開啟事務
String sql1="update account set money=money-100 where name='A'";
st=conn.prepareStatement(sql1);
st.executeUpdate();//執行1
int x=1/0;//報錯
String sql2="update account set money=money+100 where name='B'";
st=conn.prepareStatement(sql2);
st.executeUpdate();//執行2
//業務完畢,提交事務
conn.commit();
System.out.println("成功");
} catch (SQLException e) {
try {
System.out.println("失敗,回滾事務");
conn.rollback();//如果失敗,就回滾事務;不寫也會預設回滾
} catch (SQLException ex) {
ex.printStackTrace();
}
e.printStackTrace();
}finally {
JdbcUtils.release(conn,st,rs);
}
}
}
-