JDBC事務處理
阿新 • • 發佈:2022-03-08
簡單概念:要麼都成功,要麼都失敗
ACID原則:保證資料的安全
開啟事務
事務提交 commit()
事務回滾 rollback()
關閉事務
轉賬:
A:1000
B:1000
A(900) ---100--> B(1100)
Junit單元測試
依賴
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13</version> </dependency>
簡單實用
@Test註解只有在方法上有效,只要加了這個註解的方法,就可以直接執行!
import org.junit.Test;
public class JdbcACID {
@Test
public void T() {
System.out.println("SUCCESS!!!!!");
}
}
新建表並插入資料
CREATE TABLE `account`( `id` INT PRIMARY KEY, `name` VARCHAR(50) NOT NULL, `money` FLOAT NOT NULL ) ENGINE=INNODB DEFAULT CHARSET=utf8 INSERT INTO `account` (`id`, `name`, `money`) VALUES(1,'A',1000); INSERT INTO `account` (`id`, `name`, `money`) VALUES(2,'B',1000); INSERT INTO `account` (`id`, `name`, `money`) VALUES(3,'C',1000);
# 開啟事務
start transaction ;
# 模擬轉賬
update account set money=money-100 where name='A';
update account set money=money+100 where name='B';
# 回滾
rollback ;
# 提交
commit;
測試程式碼(製造異常事件)
@Test public void T(){ //獲取配置資訊 //解決中文亂碼 String url="jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8"; String username="root"; String password="6113081"; //提出物件 Connection connection=null; //1.載入驅動 try { //1.載入驅動 Class.forName("com.mysql.jdbc.Driver"); //2.連結資料庫,其物件就代表了資料庫(不安全) connection = DriverManager.getConnection(url, username, password); //通知資料庫開啟事務false開啟true是關閉 connection.setAutoCommit(false); //預編譯開啟安全的資料庫連線,進行資料庫操作 String sql1="update account set money=money-100 where name='A'"; connection.prepareStatement(sql1).executeUpdate(); //此時製造錯誤 int i=1/0; String sql2="update account set money=money+100 where name='B'"; connection.prepareStatement(sql2).executeUpdate(); //提交事務 connection.commit();//以上兩條sql都提交成功就會提交事務,否則進入catch語句執行回滾 System.out.println("SUCCESS!!!!!!"); } catch (Exception e) { try { //出現異常事務提交終止,回滾資料 connection.rollback(); } catch (SQLException ex) { ex.printStackTrace(); } e.printStackTrace(); }finally { //關閉連線釋放資源(一定要做)先開的後關 try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } }
輸出結果
資料庫變化
測試程式碼(消除異常事件)
@Test
public void T(){
//獲取配置資訊
//解決中文亂碼
String url="jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8";
String username="root";
String password="6113081";
//提出物件
Connection connection=null;
//1.載入驅動
try {
//1.載入驅動
Class.forName("com.mysql.jdbc.Driver");
//2.連結資料庫,其物件就代表了資料庫(不安全)
connection = DriverManager.getConnection(url, username, password);
//通知資料庫開啟事務false開啟true是關閉
connection.setAutoCommit(false);
//預編譯開啟安全的資料庫連線,進行資料庫操作
String sql1="update account set money=money-100 where name='A'";
connection.prepareStatement(sql1).executeUpdate();
//此時製造錯誤
//int i=1/0;
String sql2="update account set money=money+100 where name='B'";
connection.prepareStatement(sql2).executeUpdate();
//提交事務
connection.commit();//以上兩條sql都提交成功就會提交事務,否則進入catch語句執行回滾
System.out.println("SUCCESS!!!!!!");
} catch (Exception e) {
try {
//出現異常事務提交終止,回滾資料
connection.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
e.printStackTrace();
}finally {
//關閉連線釋放資源(一定要做)先開的後關
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}