1.事務的概述
- 事務指的是邏輯上的一組操作,組成這組操作的各個單元要麼全都成功,要麼全都失敗.
- 事務作用:保證在一個事務中多次操作要麼全都成功,要麼全都失敗.
1.1 mysql事務操作
- start transaction; 開啓事務
- commit; 提交事務
- rollback; 回滾事務
MYSQL中可以有兩種方式進行事務的管理:
- 自動提交:MySql默認自動提交。及執行一條sql語句提交一次事務。
- 手動提交:先開啓,再提交
1.2 JDBC事務操作
- conn.setAutoCommit(false)
開啓事務(關閉自動提交) - conn.commit()
提交事務 - conn.rollback()
回滾事務
1.3 DBUtils事務操作
- conn.setAutoCommit(false) 開啓事務
- new QueryRunner() 創建核心類,不設置數據源(手動管理連接)
- query(conn , sql , handler, params ) 或update(conn, sql , params) 手動傳遞連接
- DbUtils.commitAndClose(conn) 提交併關閉連接
- DbUtils.rollbackAndClose(conn) 回滾並關閉連接
2.ThreadLocal
ThreadLocal用於在當前線程中共享數據
ThreadLocal工具類底層就是一個Map,key存放的當前線程,value存放需要共享的數據
public static ThreadLocal<String> local = new ThreadLocal<String>();
3.事務的特性 ACID (理解)
數據庫的事務必須具備ACID特性,ACID是指 Atomic(原子性)、Consistensy(一致性)、Isolation(隔離型)和Durability(持久性)的英文縮寫。
- 原子性(Atomicity)
事務包裝的一組sql,要麼都執行成功,要麼都失敗。這些操作是不可分割的。 - 一致性(Consistency)
數據庫的數據狀態是一致的。
事務的成功與失敗,最終數據庫的數據都是符合實際生活的業務邏輯。一致性絕大多數依賴業務邏輯和原子性。 - 持久性:(Durability)
事務成功提交之後,對於數據庫的改變是永久的。哪怕數據庫發生異常,重啓之後數據亦然存在。 - 隔離性(Isolation)
一個事務的成功或者失敗對於其他的事務是沒有影響。2個事務應該相互獨立。
4.事務的隔離級別
如果不考慮事務的隔離型,由於事務的併發,將會出現以下問題:
- 髒讀 – 最嚴重,杜絕發生
- 不可重複讀
- 幻讀(虛讀)
4.1 髒讀
指一個事務讀取了另外一個事務 未提交的數據。
一個事務讀取了另一個事務沒有提交的數據,非常嚴重。應當儘量避免髒讀。
4.2 不可重複讀
在一個事務內多次讀取表中的數據,多次讀取的結果不同
4.3 幻讀(虛讀)
數據庫規範規定了4種隔離級別,分別用於描述兩個事務併發的所有情況
- read uncommitted 讀未提交,一個事務讀到另一個事務沒有提交的數據。
存在:3個問題(髒讀、不可重複讀、虛讀)。
解決:0個問題 - read committed 讀已提交,一個事務讀到另一個事務已經提交的數據。
存在:2個問題(不可重複讀、虛讀)。
解決:1個問題(髒讀) - repeatable read() :可重複讀,在一個事務中讀到的數據始終保持一致,無論另一個事務是否提交。
存在:1個問題(虛讀)。
解決:2個問題(髒讀、不可重複讀) - serializable 串行化,同時只能執行一個事務,相當於事務中的單線程。
存在:0個問題。
解決:3個問題(髒讀、不可重複讀、虛讀)
安全和性能對比:
- 安全性:串行化>可重複讀 >讀已提交 > 讀未提交
- 性能 : 串行化< 可重複讀 < 讀已提交 < 讀未提交
常見數據庫的默認隔離級別:
- MySql:repeatable read
- Oracle:read committed
在mysql數據庫中,底層對於幻讀做了優化,演示不了。