1. 程式人生 > >JDBC事物

JDBC事物

事務指的是邏輯上的一組操作,組成這組操作的各個單元要麼全都成功,要麼全都失敗.

 * 事務作用:保證在一個事務中多次操作要麼全都成功,要麼全都失敗.

 * 一組操作:同一個連線下的操作 稱為一組操作

 

mysql事務操作

sql語句                        描述

start transaction;        開啟事務

commit;                        提交事務

rollback;                回滾事務

操作:

        MYSQL中可以有兩種方式進行事務的管理:

        自動提交:MySql預設自動提交。及執行一條sql語句提交一次事務。

        手動提交:先開啟,再提交

JDBC事務操作

 * Connection

 *                 setAutoCommit(boolean b) 預設值是true 如果設定成true Mysql自動處理事務 針對的是一條語句

 *                                                                  如果設定為false 則關閉mysql自動事務 開啟手動事務

 *                 commit() 提交事務

 *                 rollBack() 回滾        

 

Connection物件的方法名                描述

conn.setAutoCommit(false)        開啟事務

conn.commit()                        提交事務

conn.rollback()                        回滾事務

 

DBUtils事務操作

Connection物件的方法名                        描述

conn.setAutoCommit(false)                開啟事務

new Q                                建立核心類,不設定資料來源(手動管理連線)

query(conn , sql , handler, params )          或

update(conn, sql , params)                手動傳遞連線

DbUtils.commitAndClose(conn)                  或

DbUtils.rollbackAndClose(conn)                提交併關閉連線

回滾並關閉連線

 

 

 

 * 事務的三個操作

 *                 1.開啟事務:將事務開啟 下面的所有操作 都是我當前事務的操作

 *                 2.提交事務:將事務提交,資料永久儲存資料庫

 *                 3.回滾:將資料返回到開啟事務之前的狀態

 *

 

使用連線池和DBUtils結合 進行轉賬

 * QueryRunner

 *                 構造方法

 *                         QueryRunner(DataSource d) 連線由QueryRunner自己管理

 *                         query update方法都不需要傳入連線

 *                         QueryRunner() 連線物件由我們自己管理

 *                         query update方法都需要傳入連線物件

 

分層概念:

開發中,常使用分層思想

        不同的層次結構分配不同的解決過程,各個層次間組成嚴密的封閉系統

        不同層級結構彼此平等

        分層的目的是:

        解耦

        可維護性

        可擴充套件性

        可重用性

 

java.lang.ThreadLocal 該類提供了執行緒區域性 (thread-local) 變數,用於在當前執行緒中共享資料。

 

ThreadLocal<T>

 *                 一條執行緒存的東西 只能當前執行緒獲取  其他執行緒獲取不到

 *

 * set(T t)新增元素

 * T  get() 獲取元素

 

 

事務特性:ACID

        原子性(Atomicity)原子性是指事務是一個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。

        一致性(Consistency)事務前後資料的完整性必須保持一致。

        隔離性(Isolation)事務的隔離性是指多個使用者併發訪問資料庫時,一個使用者的事務不能被其它使用者的事務所幹擾,多個併發事務之間資料要相互隔離。

        永續性(Durability)永續性是指一個事務一旦被提交,它對資料庫中資料的改變就是永久性的,接下來即使資料庫發生故障也不應該對其有任何影響。

併發訪問問題

如果不考慮隔離性,事務存在3中併發訪問問題。

1.        髒讀:一個事務讀到了另一個事務未提交的資料.

2.        不可重複讀:一個事務讀到了另一個事務已經提交(update)的資料。引發另一個事務,在事務中的多次查詢結果不一致。

3.        虛讀 /幻讀:一個事務讀到了另一個事務已經提交(insert)的資料。導致另一個事務,在事務中多次查詢的結果不一致。

 

解決問題

        資料庫規範規定了4種隔離級別,分別用於描述兩個事務併發的所有情況。

    1.        read uncommitted 讀未提交,一個事務讀到另一個事務沒有提交的資料。

        a)        存在:3個問題(髒讀、不可重複讀、虛讀)。

        b)        解決:0個問題

    2.        read committed 讀已提交,一個事務讀到另一個事務已經提交的資料。

        a)        存在:2個問題(不可重複讀、虛讀)。

        b)        解決:1個問題(髒讀)

    3.        repeatable read        :可重複讀,在一個事務中讀到的資料始終保持一致,無論另一個事務是否提交。

        a)        存在:1個問題(虛讀)。

        b)        解決:2個問題(髒讀、不可重複讀)

    4.        serializable 序列化,同時只能執行一個事務,相當於事務中的單執行緒。

        a)        存在:0個問題。

        b)        解決:3個問題(髒讀、不可重複讀、虛讀)

        安全和效能對比

             安全性:serializable > repeatable read > read committed > read uncommitted

              效能 : serializable < repeatable read < read committed < read uncommitted

        常見資料庫的預設隔離級別:

              MySql:repeatable read

              Oracle:read committed

 

設定資料庫的隔離級別

              set session transaction isolation level 級別字串

              級別字串:read uncommitted、read committed、repeatable read、serializable

              例如:set session transaction isolation level read uncommitted;

 

 

讀未提交:read uncommitted

        A視窗設定隔離級別

        AB同時開始事務

        A 查詢

        B 更新,但不提交

        A 再查詢-- 查詢到了未提交的資料

        B 回滾

        A 再查詢-- 查詢到事務開始前資料

 

讀已提交:read committed

        A視窗設定隔離級別

        AB同時開啟事務

        A查詢

        B更新、但不提交

        A再查詢--資料不變,解決問題【髒讀】

        B提交

        A再查詢--資料改變,存在問題【不可重複讀】

 

可重複讀:repeatable read

        A視窗設定隔離級別

        AB 同時開啟事務

        A查詢

        B更新, 但不提交

        A再查詢--資料不變,解決問題【髒讀】

        B提交

        A再查詢--資料不變,解決問題【不可重複讀】

        A提交或回滾

        A再查詢--資料改變,另一個事務

 

序列化:serializable

          A視窗設定隔離級別

          AB同時開啟事務

          A查詢

          B更新--等待(如果A沒有進一步操作,B將等待超時)

          A回滾

          B 視窗--等待結束,可以進行操作