3.事務
一.事務概述
- 什麼是事務
一件事情有n個組成單元 要不這n個組成單元同時成功 要不n個單元就同時失敗,就是將n個組成單元放到一個事務中
2.mysql的事務
預設的事務:一條sql語句就是一個事務 預設就開啟事務並提交事務
手動事務:
1)顯示的開啟一個事務:start transaction
2)事務提交:commit代表從開啟事務到事務提交 中間的所有的sql都認為有效真正的更新資料庫
3)事務的回滾:rollback 代表事務的回滾 從開啟事務到事務回滾 中間的所有的 sql操作都認為無效資料庫沒有被更新
二.JDBC事務操作
預設是自動事務:
執行sql語句:executeUpdate() ---- 每執行一次executeUpdate方法 代表 事務自動提交
通過jdbc的API手動事務:
開啟事務:conn.setAutoComnmit(false);
提交事務:conn.commit();
回滾事務:conn.rollback();
注意:控制事務的connnection必須是同一個
執行sql的connection與開啟事務的connnection必須是同一個才能對事務進行控制
package com.xiaowei.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; /* * 1.匯入JDBC包 * 1.1 在伺服器上建立資料庫web19 和 資料表 account */ public class JDBCServlet { public static void main(String[] args) { Connection conn = null; try { // 2.註冊驅動 Class.forName("com.mysql.jdbc.Driver"); // 3.獲得conneciton連線物件 conn = DriverManager.getConnection("jdbc:mysql:///web19", "root", "12345678"); // 4.手動開啟事物 conn.setAutoCommit(false); // 5.建立執行平臺 Statement stat = conn.createStatement(); // 6.編寫sql語句 執行sql語句 String sql = "update account set price=9999 where name='car'"; stat.executeUpdate(sql); // 7.提交事物 conn.commit(); // 8.關閉資源 stat.close(); conn.close(); } catch (Exception e) { // 9.回滾 try { conn.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } e.printStackTrace(); } } }
三.DBUtils事務操作
- QueryRunner
有參構造:QueryRunner runner = new QueryRunner(DataSource dataSource);
有參構造將資料來源(連線池)作為引數傳入QueryRunner,QueryRunner會從連線池中獲得一個數據庫連線資源操作資料庫,所以直接使用無Connection引數 的update方法即可操作資料庫
無參構造:QueryRunner runner = new QueryRunner();
無參的構造沒有將資料來源(連線池)作為引數傳入QueryRunner,那麼我們在使用QueryRunner物件操作資料庫時要使用 有Connection引數的方法
package com.xiaowei.dbutils;
import java.sql.Connection;
import java.sql.SQLException;
import org.apache.commons.dbutils.QueryRunner;
import com.xiaowei.utils.DataSourceUtils;
/*
* 1.匯入DBUtils包
* 2.匯入建立快取池的工具類
* 3.匯入c3p0配置檔案
*/
public class Dbutils {
public static void main(String[] args) {
Connection conn = null;
try {
// 4.建立queryrunner物件
QueryRunner runner = new QueryRunner();
// 5.獲得連線物件
conn = DataSourceUtils.getConnection();
// 6.開啟事物
conn.setAutoCommit(false);
// 7.編寫sql語句 執行sql操作
String sql = "update account set price=? where name=?";
runner.update(conn, sql, "9876","car");
// 8.提交事物
conn.commit();
} catch (SQLException e) {
// 9.回滾
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}
}
}