如何在JDBC中使用事務
步驟 1 : 不使用事務的情況
沒有事務的前提下
假設業務操作是:加血,減血各做一次
結束后,英雄的血量不變
而減血的SQL
不小心寫錯寫成了 updata(而非update)
那么最后結果是血量增加了,而非期望的不變
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class TestJDBC {
public static void main(String[] args) {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try (Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/how2java?characterEncoding=UTF-8","root", "admin");
Statement s = c.createStatement();) {
//沒有事務的前提下
//假設業務操作時,加血,減血各做一次
//結束后,英雄的血量不變
//加血的SQL
String sql1 = "update hero set hp = hp +1 where id = 22";
s.execute(sql1);
//減血的SQL
//不小心寫錯寫成了 updata(而非update)
String sql2 = "updata hero set hp = hp -1 where id = 22";
s.execute(sql2);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
步驟 2 : 使用事務
在事務中的多個操作,要么都成功,要么都失敗
通過 c.setAutoCommit(false);關閉自動提交
使用 c.commit();進行手動提交
在22行-35行之間的資料庫操作,就處于同一個事務當中,要么都成功,要么都失敗
所以,雖然第一條SQL陳述句是可以執行的,但是第二條SQL陳述句有錯誤,其結果就是兩條SQL陳述句都沒有被提交, 除非兩條SQL陳述句都是正確的,
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class TestJDBC {
public static void main(String[] args) {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try (Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/how2java?characterEncoding=UTF-8","root", "admin");
Statement s = c.createStatement();) {
// 有事務的前提下
// 在事務中的多個操作,要么都成功,要么都失敗
c.setAutoCommit(false);
// 加血的SQL
String sql1 = "update hero set hp = hp +1 where id = 22";
s.execute(sql1);
// 減血的SQL
// 不小心寫錯寫成了 updata(而非update)
String sql2 = "updata hero set hp = hp -1 where id = 22";
s.execute(sql2);
// 手動提交
c.commit();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
步驟 3 : MYSQL 表的型別必須是INNODB才支持事務
在Mysql中,只有當表的型別是INNODB的時候,才支持事務,所以需要把表的型別設定為INNODB,否則無法觀察到事務.
修改表的型別為INNODB的SQL:
alter table hero ENGINE = innodb;
查看表的型別的SQL
show table status from how2java;
不過有個前提,就是當前的MYSQL服務器本身要支持INNODB,如果不支持,請看 開啟MYSQL INNODB的辦法
更多內容,點擊了解: 如何在JDBC中使用事務
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/138756.html
標籤:Java
