在實際功能當中,經常會碰到同時對一組數據進行增加和減少,最常見的就是交易功能。
事務內執行的語句,要么都成功,要么都失敗,如果有一句沒執行成功,整個事務都不會提交的。
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; public class JDBC_transactions { public static void main(String[] args) { //使用try-with-resources的方法自動關閉連接 //首先還是先初始化驅動 try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } //連接數據庫 try (Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/how2java?characterEncoding=UTF-8", "root", "admin"); Statement statement = connection.createStatement();) { //執行一個事務 //首先關閉自動提交 connection.setAutoCommit(false); //執行兩個更新語句,一個增加某個字段,一個減少某個字段 String sql1="update hero set hp=hp-10 where id=1"; String sql2="update hero set hp=hp+10 where id=1"; statement.execute(sql1); statement.execute(sql2); //手動提交 connection.commit(); } catch (SQLException e) { e.printStackTrace(); } } }
這句話就是關閉自動提交。
connection.setAutoCommit(false);
一直到
connection.commit();
這兩句話內的sql語句就是一個事務。如果我們故意制造個錯誤,比如故意寫錯sql語句的某個關鍵字,編譯器會報錯,並且正確的sql語句不會提交。