MySQL 事務 Transaction 詳解

2021-10-14 03:59:48 字數 3374 閱讀 6485

2、事務的acid特性

3、事務併發引起的問題

4、不同的隔離級別的鎖的情況

5、隱式提交

事務(transaction)是由一系列對系統中資料進行訪問更新的操作所組成的乙個程式執行行邏輯單元;

是乙個最小的不可分割的工作單元,能保證乙個業務的完整性;

事務中可能包含乙個或多個sql語句,這些語句要麼都執行,要麼都不執行。

start transaction;/ begin;

commit; 使得當前的修改確認

rollback; 使得當前的修改被放棄(回滾)

事務的原子性是指事務必須是乙個原子的操作序列單元。表示事務內的全部操作為乙個整體,要麼全部成功,要麼全部失敗。不會結束在中間某個環節。事務在執行過程中發生錯誤,會被回滾(rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。

為了實現原子性,需要通過日誌:將所有對資料的更新操作都寫入日誌,如果乙個事務中的一部分操作已經成功,但以後的操作,由於斷電/系統崩潰/其它的軟硬體錯誤而無法繼續,則通過回溯日誌,將已經執行成功的操作撤銷,從而達到「全部操作失敗」的目的。

事務的一致性是指系統從乙個正確的狀態,遷移到另乙個正確的狀態.什麼叫正確的狀態呢?就是當前的狀態滿足預定的約束就叫做正確的狀態。而事務具備acid裡c的特性是說通過事務的aid來保證我們的一致性。c是目的,aid都是手段。

事務的隔離性是指在併發環境中,併發的事務是互相隔離的。也就是說,不同的事務併發操作相同的資料時,每個事務都有各自完整的資料空間,如果在乙個事務中要檢視資料所處的狀態,要麼是另外乙個併發事務修改它之前的狀態,要麼是另乙個事務修改它之後的狀態,事務不會檢視中間狀態的資料。

乙個事務內部的操作及使用的資料對其它併發事務是隔離的,併發執行的各個事務是不能互相干擾的。

事務的永續性是指事務一旦提交後,資料庫中的資料必須被永久的儲存下來。即使服務器系統崩潰或服務器宕機等故障。只要資料庫重新啟動,那麼一定能夠將其恢復到事務成功結束後的狀態。

事務隔離級別

髒讀不可重複讀

幻讀讀未提交(read_uncommitted)

允許允許

允許讀已提交(read_committed)

禁止允許

允許可重複讀(repeatable_read)

禁止禁止

可能會順序讀(serializable)

禁止禁止

禁止檢視當前會話中的事務隔離級別

-- mysql 8前

select @@tx_isolation

;-- mysql 8後

select @@transaction_isolation

;

讀未提交,該隔離級別允許髒讀取,其隔離級別是最低的。換句話說,如果乙個事務正在處理某一資料,並對其進行了更新,但同時尚未完成事務,因此還沒有提交事務;而以此同時,允許另乙個事務也能夠訪問該資料。

– mysql設定隔離級別讀未提交

set session transaction isolation level read uncommitted;

髒讀示例:

在事務a和事務b同時執行時可能會出現如下場景:

餘額應該為1500元才對。請看t5時間點,事務a此時查詢的餘額為0,這個資料就是髒資料,他是事務b造成的,很明顯是事務沒有進行隔離造成的。

讀已提交是不同的事務執行的時候只能獲取到已經提交的資料。這樣就不會出現上面的髒讀的情況了。但是在同乙個事務中執行同乙個讀取,結果不一致。

– mysql設定隔離級別 讀已提交 read_committed

set session transaction isolation level read committed;

不可重複讀示例:

可是解決了髒讀問題,但是還是解決不了可重複讀問題。

事務a其實除了查詢兩次以外,其它什麼事情都沒做,結果錢就從1000變成0了,這就是不可重複讀的問題。

可重複讀就是保證在事務處理理過程中,多次讀取同乙個資料時,該資料的值和事務開始時刻是一致的。(自己事務提交後才可以讀取更新的值)因此該事務級別限制了不可重複讀和髒讀,但是有可能出現幻讀的資料。

– mysql設定隔離級別 可重複讀 repeatable_read

set session transaction isolation level repeatable read;

幻讀:幻讀就是指同樣的事務操作,在前後兩個時間段內執行對同乙個資料項的讀取,可能出現不一致的結果。

詭異的更新事件:

順序讀是最嚴格的事務隔離級別。它要求所有的事務排隊順序執行,即事務只能乙個接乙個地處理,不能併發。

– mysql設定隔離級別 順序讀 serializable

set session transaction isolation level serializable;

幻讀和不可重複讀兩者區別:

不可重複讀:a事務在執行過程中,b事務對資料進行了修改或刪除,導致a兩次讀取的資料不一致;

不可重複讀重點在於update和delete(鎖行即可解決)

幻讀:a事務在執行過程中,b事務新增了符合a事務要查詢的資料,導致a兩次讀取的資料不一致;

幻讀重點在於insert(需要鎖表解決)

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

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

可重複讀(rr):有行級的鎖,也有間隙鎖,每次讀取的資料都是一樣的,並且沒有幻讀的情況。

序列列化(s):有行級鎖,也有間隙鎖,讀表的時候,就已經上鎖了

dql:查詢語句dml:寫操作(新增,刪除,修改)

ddl:定義語句(建庫,建表,修改表,索引操作,儲存過程,檢視)

dcl:控制語言(給⽤使用者授權,或刪除授權)

ddl(data define language):都是隱式提交。

隱式提交:執行這種語句相當於執行commit;ddl

mysql 事務 數量 Mysql 事務

什麼是事務 不可分割的操作,比如乙個事務要修改 a 表和刪除 b 表的資料兩個操作,這兩個操作都成功,這個事務才 commit,不然 rollback 每條 sql 語句都是乙個事務 只對 dml 生效 caid 一致性 consistency 讓資料保持一定程度的合理性,比如使用者加入購物車,購物...

mysql事務機制 Mysql事務機制

mysql事務是指將資料庫從一種一致性狀態轉到另一種一致性狀態 mysql事務具有acid特性 原子性 atomicity 事務中的所有操作,要麼全部執行,要麼都不執行 一致性 consistency 事務開始和結束後,資料庫的完整性不會被破壞 隔離性 isolation 事務之間互不影響。事務的隔...

mysql事務死鎖 MySQL事務 死鎖

一 概念 多個事務在同一資源上互相占用形成迴路。這就是死鎖 基本命令 檢視是否自動提交事務 show variables like autocommit 設定事務是否自動提交 set autocommit 0 set autocommit 1 二 例子 create table user id bi...