JavaWEB開發13——事務與連線池

扎瓦發表於2019-01-19

一、事務概述
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必須是同一個才能對事務進行控制

三、DBUtils事務操作
1.QueryRunner
有參構造:QueryRunner runner = new QueryRunner(DataSource dataSource);
有參構造將資料來源(連線池)作為引數傳入QueryRunner,QueryRunner會從連 接池中獲得一個資料庫連線資源運算元據庫,所以直接使用無Connection引數 的update方法即可運算元據庫

無參構造:QueryRunner runner = new QueryRunner();
無參的構造沒有將資料來源(連線池)作為引數傳入QueryRunner,那麼我們在使 用QueryRunner物件運算元據庫時要使用有Connection引數的方法

四、使用ThreadLocal繫結連線資源

五、事務的特性和隔離級別(概念性問題—面試)
1.事務的特性ACID
 1)原子性(Atomicity)原子性是指事務是一個不可分割的工作單位,事務中的操作 要麼都發生,要麼都不發生。 
 2)一致性(Consistency)一個事務中,事務前後資料的完整性必須保持一致。
 3)隔離性(Isolation)多個事務,事務的隔離性是指多個使用者併發訪問資料庫時, 一個使用者的 事務不能被其它使用者的事務所干擾,多個併發事務之間資料要相互隔離。
 4)永續性(Durability)永續性是指一個事務一旦被提交,它對資料庫中資料的改變 就是永久性的,接下來即使資料庫發生故障也不應該對其有任何影響。

2.併發訪問問題—-由隔離性引起
如果不考慮隔離性,事務存在3中併發訪問問題。
1)髒讀:B事務讀取到了A事務尚未提交的資料 —— 要求B事務要讀取A事 務提交的資料
2)不可重複讀:一個事務中 兩次讀取的資料的內容不一致 —– 要求的是一個事 務中多次讀取時資料是一致的 — unpdate
3)幻讀/虛讀:一個事務中 兩次讀取的資料的數量不一致 —– 要求在一個事務多 次讀取的資料的數量是一致的 –insert delete
3.事務的隔離級別
1)read uncommitted : 讀取尚未提交的資料 :哪個問題都不能解決
2)read committed:讀取已經提交的資料 :可以解決髒讀 —- oracle預設的
3)repeatable read:重讀讀取:可以解決髒讀 和 不可重複讀 —mysql預設的
4)serializable:序列化:可以解決 髒讀 不可重複讀 和 虛讀—相當於鎖表

注意:mysql資料庫預設的隔離級別
檢視mysql資料庫預設的隔離級別:select @@tx_isolation
設定mysql的隔離級別:set session transaction isolation level 設定事務隔離級別

總結:

mysql的事務控制:
        開啟事務:start transaction;
        提交:commit;
        回滾:rollback;
JDBC事務控制:
        開啟事務:conn.setAutoCommit(false);
        提交:conn.commit();
        回滾:conn.rollback();
    DBUtils的事務控制 也是通過jdbc
        
    ThreadLocal:實現的是通過執行緒繫結的方式傳遞引數

    概念:
        事務的特性ACID
        併發問題:髒讀、不可重讀、虛讀幻讀
        解決併發:設定隔離級別
            read uncommitted
            read committed
            repeatable read (mysql預設)
            serialazable 

        隔離級別的效能:
            read uncommitted>read committed>repeatable read>serialazable 
        安全性:
            read uncommitted<read committed<repeatable read<serialazable

相關文章