數據庫進階

事務

事務(Transaction)是由一系列對系統中數據進⾏訪問與更新的操做所組成的⼀個程序執行邏輯單元。 (1) 事務的 語法 (2) 事務的特性 (3) 事務併發問題 (4) 事務隔離級別 (5) 不一樣隔離級別的鎖的狀況(瞭解) (6) 隱式提交(瞭解)
imagemysql

1.1 事務的語法

  1. start transaction; begin;
  2. commit; 使得當前的修改確認
  3. rollback; 使得當前的修改被放棄

1.2 事務的ACID特性

  1. 原⼦性(Atomicity) 事務的原⼦性是指事務必須是⼀個原子的操做序列單元。事務中包含的各項操做在⼀次執⾏過程當中,只 容許出現兩種狀態之一。 (1)所有執行成功 (2)所有執行失敗 事務開始後全部操做,要麼所有作完,要麼所有不作,不可能停滯在中間環節。事務執⾏過程當中出錯, 會回滾到事務開始前的狀態,全部的操做就像沒有發⽣同樣。也就是說事務是⼀個不可分割的總體,就 像化學中學過的原子,是物質構成的基本單位。sql

  2. ⼀致性(Consistency) 事務的一致性是指事務的執⾏不能破壞數據庫數據的完整性和一致性,一個事務在執⾏以前和執行以後,數據庫都必須處以⼀致性狀態。 好比:若是從A帳戶轉帳到B帳戶,不可能由於A帳戶扣了錢,⽽B帳戶沒有加錢。數據庫

  3. 隔離性(Isolation) 事務的隔離性是指在併發環境中,併發的事務是互相隔離的。也就是說,不一樣的事務併發操做相同的數 據時,每一個事務都有各自完整的數據空間。 ⼀個事務內部的操做及使用的數據對其它併發事務是隔離的,併發執行的各個事務是不能互相干擾的。 隔離性分4個級別,下面會介紹。安全

  4. 持久性(Duration) 事務的持久性是指事務⼀旦提交後,數據庫中的數據必須被永久的保存下來。即便服務器系統崩潰或服 務器宕機等故障。只要數據庫從新啓動,那麼必定可以將其恢復到事務成功結束後的狀態服務器

1.3 事務的併發問題

髒讀:讀取到了沒有提交的數據, 事務A讀取了事務B更新的數據,而後B回滾操做,那麼A讀取到的 數據是髒數據。
image
不可重複讀:同⼀條命令返回不一樣的結果集(更新).事務 A 屢次讀取同一數據,事務 B 在事務A 屢次讀取的 過程當中,對數據作了更新並提交,致使事務A屢次讀取同一數據時,結果不一致。
image
幻讀:重複查詢的過程當中,數據 就發⽣了量的變化(insert, delete)。
image併發

1.4 事務隔離級別

image
4種事務隔離級別從上往下,級別越高,併發性越差,安全性就愈來愈高。 ⼀般數據默認級別是 讀以提交或可重複讀3d

查看當前會話中事務的隔離級別
select @@transaction_isolation; mysql8之後
select @@tx_isolation; mysql8之前code

  1. 讀未提交(READ_UNCOMMITTED)
    讀未提交,該隔離級別容許髒讀取,其隔離級別是最低的。換句話說,若是一個事務正在處理理某一數 據,並對其進⾏了更新,但同時還沒有完成事務,所以尚未提交事務;而以此同時,容許另外一個事務也 可以訪問該數據。 髒讀示例:
    在事務A和事務B同時執行時可能會出現以下場景:
    image
    餘額應該爲1500元纔對。請看T5時間點,事務A此時查詢的餘額爲0,這個數據就是髒數據,他是事務B 形成的很明顯是事務沒有進行隔離形成的。blog

  2. 讀已提交(READ_COMMITTED)
    讀已提交是不一樣的事務執行的時候只能獲取到已經提交的數據。 這樣就不會出現上面的髒讀的狀況了。 可是在同一個事務中執行同一個讀取,結果不一致 不可重複讀示例 但是解決了髒讀問題,可是仍是解決不了可重複讀問題。
    image
    事務A其實除了了查詢兩次之外,其它什什麼事情都沒作,結果錢就從1000變成0了了,這就是不不可重複讀的問題。事件

  3. 可重複讀(REPEATABLE_READ)
    可重複讀就是保證在事務處理理過程當中,屢次讀取同一個數據時,該數據的值和事務開始時刻是一致的。 所以該事務級別限制了不可重複讀和髒讀,可是有可能出現幻讀的數據。 幻讀幻讀就是指一樣的事務操做,在先後兩個時間段內執行對同一個數據項的讀取,可能出現不一致的結果。 詭異的更新事件
    image

  4. 順序讀(SERIALIZABLE) 順序讀是最嚴格的事務隔離級別。它要求全部的事務排隊順序執⾏行行,即事務只能一個接一個地處理,不 能併發。

相關文章
相關標籤/搜索