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 視窗--等待結束,可以進行操作