Mysql資料庫事務 備忘

2021-07-30 08:02:11 字數 2700 閱讀 6750

一.設定mysql的事務級別

1) my.ini檔案中:

# read-uncommitted, read-committed, repeatable-read,serializable

transaction_isolation = read-committed

2) 啟動引數指定:

./mysqld --transaction-isolation=read-committed
3) 命令列指定:

mysql>set global transaction isolation level read committed
命令列的引數列表為: 

set [global | session] transaction isolation level
通過命令列設定事務級別之後,需要關閉當前視窗,因為修改後的新引數不會對當前會話生效.mysql中預設的事務級別為"repeatable read".可以通過"select @@global.tx_isolation;"來檢視當前全域性的事務級別.

二,事務隔離級別

1) read uncommitted:隔離級別最低,併發能力最高.未提交讀(讀到未提交),簡單來說,就是事務中(或者非事務)可以讀取到其他事務已經更新但尚未提交的資料--髒讀.也會出現"不可重複讀""幻讀"等問題. 此事務隔離級別,只會對不同事務中update/select for update等行鎖進行"序列化"執行(阻塞),而對於read操作就像"沒有事務"一樣.(對於innodb引擎,預設情況下,r/w均會在乙個自動提交的事務中進行)

圖1 會話1中事務開啟:執行更新,但未提交

圖2  會話2中非事務下read到未提交的資料,且update操作阻塞(因為會話1中的事務update時鎖定了id = 1的行)

2) read_committed:已提交讀,即只能讀取到已經提交的事務所update的資料,會出現"不可重複讀","幻讀"問題.如果2個並行的事務,其中事務1第一次read時獲得一條記錄,此後事務2對此記錄進行了更改且事務提交,那麼此時事務1再次read時,將會獲得已經提交的新記錄資料,因此為"不可重複的".

圖3.3) repeatable_read:可重複讀,有"幻讀"問題;只能讀取到其他事務已經提交的資料,且如果當前事務中對某條記錄曾近read過,那麼此後在事務中多次重複read,將會得到相同的資料,即使此時其他事務已經對此資料進行了更改;由此可見在repeatable_read隔離級別中,read操作將會產生snapshot,此後多次read只會從snapshot中獲取資料;這也是它和"read committed"的區別---"read commiteed"不會使用snapshot.

此隔離級別,通常被用在對資料一致性要求較高的環境中.它通常意味著,每個事務將會對read/update選取的行加鎖.

4) serializable:序列化,隔離級別最高.將所有的事務序列化,因此併發能力有效,通常可以理解為事務導致了"表鎖".

圖4 事務1中select選取行

圖5 事務2中對此行進行update,此時update阻塞直到事務1結束.

由此可見,serializable級別通過對事務選取的行加鎖的方式(select或者update等),來阻止其他事務對資料的更改:事務1對通過select對id=1的資料加鎖,那麼事務2嘗試update也將阻塞直到事務1結束;此外如果事務1通過update方式對id=1的行加鎖,那麼事務2對此行select也會阻塞..此隔離級別通過這種方式,嚴格的杜絕的"髒讀""不可重複讀""幻讀"的發生.(其他隔離級別中,不會出現read行加鎖的情況.)

上述各個隔離級別中,如果事務1對id = 1的資料更改,事務2也嘗試update時,將會導致事務2阻塞,直到事務1提交;這也是mysql為了避免"更新丟失"的解決方式.不過在serializable級別中還有特殊的情況.

"髒讀":讀取了乙個尚未確定的值,通常是事務中(或者在read uncommitted隔離級別中的非事務)讀取了其他事務尚未提交的值.

"不可重複讀":髒讀的一種表現,通常為多個事務並行操作時發生.

"幻讀":多個事務並行操作時,當讀取的資料位多行資料時(range),乙個事務中多次讀取發生資料條數不一致的情況.

大小: 13 kb

大小: 15.1 kb

大小: 50.7 kb

大小: 16.6 kb

大小: 9 kb

mysql資料庫事務

維基百科 事務是資料庫管理系統 dbms 執行過程中的乙個邏輯單位,由乙個有限的資料庫操作序列構成。只有innodb和ndb 1 原子性 atomicity 事務中的全部操作在資料庫中是不可分割的,要麼全部完成,要麼全部不執行。2 一致性 consistency 幾個並行執行的事務,其執行結果必須與...

MySQL資料庫事務

文章出處 只有innodb引擎支援事務,下邊的內容均以innodb引擎為預設條件 1 髒讀 2 不可重複讀 3 幻讀 1 讀未提交 read uncommitted 可能產生髒讀 不可重複讀 幻讀 2 讀已提交 read committed 避免了髒讀,可能產生不可重複讀 幻讀 3 可重複讀 rep...

mysql資料庫事務

原子性 乙個事務 transaction 中的所有操作,要麼全部完成,要麼全部不完成,不會結束在中間某個環節 一致性 在事務開始之前和事務結束以後,資料庫的完整性沒有被破壞 隔離性 資料庫允許多個併發事務同時對其資料進行讀寫和修改的能力,隔離性可以防止多個事務併發執行時由於交叉執行而導致資料的不一致...