1. 程式人生 > 其它 >資料庫進階——事務

資料庫進階——事務

一:事務概念

1.事務(Transaction)是由一系列對系統中資料進⾏訪問與更新的操作所組成的⼀個程式執行邏輯單元。(比如sqlyog menven 控制檯等,執行時都是一個事務)

2.本章學習路徑:(1) 事務的語法

(2) 事務的特性

(3) 事務併發問題

(4) 事務隔離級別

(5) 不同隔離級別的鎖的情況(瞭解)

(6) 隱式提交(瞭解)

二:事務語法

1. start transaction; begin; 開始事務 2. commit; 提交事務(使得當前的修改確認) 3. rollback; 回滾(使得當前的修改被放棄)

三:事務的ACID特性

1. 原⼦性(Atomicity) 事務的原⼦性是指事務必須是⼀個原子的操作序列單元。事務中包含的各項操作在⼀次執⾏過程中,只允許出現兩種狀態之一。 (1)全部執行成功 (2)全部執行失敗 事務開始後所有操作,要麼全部做完,要麼全部不做,不可能停滯在中間環節。事務執⾏過程中出錯,會回滾到事務開始前的狀態,所有的操作就像沒有發⽣一樣 也 就是說事務是⼀個不可分割的整體,就像化學中學過的原子,是物質構成的基本單位。 2. ⼀致性(Consistency) 事務的一致性是指事務的執⾏不能破壞資料庫資料的完整性和一致性,一個事務在執⾏之前和執行之後,資料庫都必須處以⼀致性狀態。比如:如果從A賬戶轉賬到 B賬戶,不可能因為A賬戶扣了錢,⽽B賬戶沒有加錢。 3. 隔離性(Isolation) 事務的隔離性是指在併發環境中,併發的事務是互相隔離的。也就是說,不同的事務併發操作相同的資料時,每個事務都有各自完整的資料空間。⼀個事務內部的操 作及使用的資料對其它併發事務是隔離的,併發執行的各個事務是不能互相干擾的。隔離性分4個級別,下面會介紹。 4. 永續性(Duration) 事務的永續性是指事務⼀旦提交後,資料庫中的資料必須被永久的儲存下來。即使伺服器系統崩潰或伺服器宕機等故障。只要資料庫重新啟動,那麼一定能夠將其恢 復到事務成功結束後的狀態。

四:事務併發問題

1. 髒讀:讀取到了沒有提交的資料, 事務A讀取了事務B更新的資料,然後B回滾操作,那麼A讀取到的 資料是髒資料 2.不可重複讀:同⼀條命令返回不同的結果集(更新).事務 A 多次讀取同一資料,事務 B 在事務A 多次讀取的過程中,對資料做了更新並提交,導致事務A多次讀取同 一資料時,結果不一致。 3. 幻讀:重複查詢的過程中,資料就發⽣了量的變化(insert, delete)

五:事務隔離等級

(4種事務隔離級別從上往下,級別越高,併發性越差,安全性就越來越高。 ⼀般資料預設級別是 讀以提交或可重複讀) 1.檢視當前會話中事務的隔離級別:select @@transaction_isolation 2.設定當前會話中的事務隔離級別 : set session transaction isolation level read uncommitted; 3.1) 讀未提交(READ_UNCOMMITTED) 讀未提交,該隔離級別允許髒讀取,其隔離級別是最低的。換句話說,如果一個事務正在處理理某一資料,並對其進⾏了更新,但同時尚未完成事務,因此還沒有 提交事務;而以此同時,允許另一個事務也能夠訪問該資料. 3.2)讀已提交(READ_COMMITTED)讀已提交是不同的事務執行的時候只能獲取到已經提交的資料。 這樣就不會出現上面的髒讀的情況了。但是在同一個事務中執 行同一個讀取,結果不一致不可重複讀示例,可是解決了髒讀問題,但是還是解決不了可重複讀問題。 3.3)可重複讀(REPEATABLE_READ)可重複讀就是保證在事務處理理過程中,多次讀取同一個資料時,該資料的值和事務開始時刻是一致的。因此該事務級別限制 了不可重複讀和髒讀,但是有可能出現幻讀的資料。幻讀幻讀就是指同樣的事務操作,在前後兩個時間段內執行對同一個資料項的讀取,可能出現不一致的結果。 詭異的更新事件 3.4)順序讀(SERIALIZABLE)順序讀是最嚴格的事務隔離級別。它要求所有的事務排隊順序執⾏行行,即事務只能一個接一個地處理,不能併發。

六:不同隔離級別的鎖的情況(瞭解)

1. 讀未提交(RU): 有行級的鎖,沒有間隙鎖。它與RC的區別是能夠查詢到未提交的資料。

2. 讀已提交(RC):有行級的鎖,沒有間隙鎖,讀不到沒有提交的資料。

3. 可重複讀(RR):有行級的鎖,也有間隙鎖,每次讀取的資料都是一樣的,並且沒有幻讀的情況。 4. 序列化(S):有行級鎖,也有間隙鎖,讀表的時候,就已經上鎖了

七:隱式提交(瞭解)

DQL:查詢語句句 DML:寫操作(新增,刪除,修改) DDL:定義語句句(建庫,建表,修改表,索引操作,儲存過程,檢視) DCL:控制語⾔言(給⽤使用者授權,或刪除授權) DDL(Data Defifine Language):都是隱式提交。 隱式提交:執⾏行行這種語句句相當於執⾏行行commit;