?? transaction.java
字號:
package book.database;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;
import java.sql.Statement;
/**
* 判斷數據庫是否支持事務,如果支持,如何實現事務的提交與回滾。
* MySQL中如果要使用事物,必須使用InnoDB存儲引擎,在創建表時,后面加上ENGINE=InnoDB。
* MySQL默認的存儲引擎是MyISAM,不支持事物
*/
public class Transaction {
/**
* 判斷數據庫是否支持事務
* @param con 數據庫的連接
* @return
*/
public static boolean supportTransaction(Connection con){
try {
// 得到數據庫的元數據
DatabaseMetaData md = con.getMetaData();
return md.supportsTransactions();
} catch (SQLException e) {
e.printStackTrace();
}
return false;
}
/**
* 將一組SQL語句放在一個事務里執行,要某全部執行通過,要某全部不執行
* @param con 數據庫的連接
* @param sqls 待執行的SQL數組
*/
public static void goTransaction(Connection con, String[] sqls){
if (sqls == null){
return ;
}
Statement sm = null;
try {
// 事務開始
System.out.println("事務開始!");
// 設置連接不自動提交,即用該連接進行的操作都不更新到數據庫
con.setAutoCommit(false);
sm = con.createStatement();
for (int i=0; i<sqls.length; i++){
// 執行SQL語句,但是沒更新到數據庫
sm.execute(sqls[i]);
}
// 提交,立即更新到數據庫
System.out.println("事務提交!");
con.commit();
System.out.println("事務結束!");
// 事務結束
} catch (SQLException e) {
try {
// 出現異常時,進行回滾,取消前面執行的操作
System.out.println("事務執行失敗,進行回滾!");
con.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
} finally {
OperateDB.closeStatement(sm);
}
}
public static void main(String[] args) throws ClassNotFoundException,
SQLException {
String dbName = "studentdb";
String userName = "test";
String password = "test";
String[] sqls = new String[3];
sqls[0] = "UPDATE student_basic_innodb SET score=93 where name='john'";
sqls[1] = "INSERT INTO student_basic_innodb (name, age, score)"
+ " VALUES ('zhangsan', 17, 86)";
// 執行這條語句會引起錯誤,因為表student_basic_innodb沒有xxxxxxx列
sqls[2] = "DELETE FROM student_basic_innodb where xxxxxxx='wade'";
Connection con = null;
try {
// 獲得數據庫連接
con = DBConnector.getMySQLConnection(null, null, null, dbName,
userName, password);
// 判斷是否支持批處理
boolean supportTransaction = Transaction.supportTransaction(con);
System.out.println("支持事務? " + supportTransaction);
if (supportTransaction){
// 執行事務
Transaction.goTransaction(con, sqls);
}
} catch (ClassNotFoundException e1) {
throw e1;
} catch (SQLException e2) {
throw e2;
} finally {
// 關閉數據庫連接
OperateDB.closeConnection(con);
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -