1. 程式人生 > >3.事務

3.事務

一.事務概述

  1. 什麼是事務

一件事情有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事務操作

  1. 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();
		}	
	}
}