複習_事務和隔離級別

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(持久性)的英文縮寫。

  1. 原子性(Atomicity)
    事務包裝的一組sql,要麼都執行成功,要麼都失敗。這些操作是不可分割的。
  2. 一致性(Consistency)
    數據庫的數據狀態是一致的。
    事務的成功與失敗,最終數據庫的數據都是符合實際生活的業務邏輯。一致性絕大多數依賴業務邏輯和原子性。
  3. 持久性:(Durability)
    事務成功提交之後,對於數據庫的改變是永久的。哪怕數據庫發生異常,重啓之後數據亦然存在。
  4. 隔離性(Isolation)
    一個事務的成功或者失敗對於其他的事務是沒有影響。2個事務應該相互獨立。

4.事務的隔離級別

如果不考慮事務的隔離型,由於事務的併發,將會出現以下問題:

  1. 髒讀 – 最嚴重,杜絕發生
  2. 不可重複讀
  3. 幻讀(虛讀)

4.1 髒讀

指一個事務讀取了另外一個事務 未提交的數據。
在這裏插入圖片描述
一個事務讀取了另一個事務沒有提交的數據,非常嚴重。應當儘量避免髒讀。

4.2 不可重複讀

在一個事務內多次讀取表中的數據,多次讀取的結果不同
在這裏插入圖片描述

4.3 幻讀(虛讀)

在這裏插入圖片描述

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

  1. read uncommitted 讀未提交,一個事務讀到另一個事務沒有提交的數據。
    存在:3個問題(髒讀、不可重複讀、虛讀)。
    解決:0個問題
  2. read committed 讀已提交,一個事務讀到另一個事務已經提交的數據
    存在:2個問題(不可重複讀、虛讀)。
    解決:1個問題(髒讀)
  3. repeatable read() :可重複讀,在一個事務中讀到的數據始終保持一致,無論另一個事務是否提交。
    存在:1個問題(虛讀)。
    解決:2個問題(髒讀、不可重複讀)
  4. serializable 串行化,同時只能執行一個事務,相當於事務中的單線程。
    存在:0個問題。
    解決:3個問題(髒讀、不可重複讀、虛讀)

安全和性能對比:

  • 安全性:串行化>可重複讀 >讀已提交 > 讀未提交
  • 性能 : 串行化< 可重複讀 < 讀已提交 < 讀未提交

常見數據庫的默認隔離級別:

  • MySql:repeatable read
  • Oracle:read committed

在mysql數據庫中,底層對於幻讀做了優化,演示不了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章