mysql 事務及隔離級別

2021-10-08 17:21:51 字數 3188 閱讀 3905

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

在同乙個事務中所進行的操作,要麼都成功,要麼就什麼都不做。理想中的事務必須滿足四大特性,這就是大名鼎鼎的acid。

a(atomicity)-原子性

是指乙個事務要麼全部執行,要麼不執行,也就是說乙個事務不可能只執行了一半就停止了。

比如 a 賬戶 向b賬戶轉賬 a 減 100 元 b 必須增加 100 元 試想,如果第一步成功了,那麼第二步失敗了,那就等於a的100元錢直接消失了,相信這是任何人都不能接受的事項,所以資料庫事務才需要保證原子性。

c (consistent)-一致性

指的是在事務開始之前和事務結束之後,資料庫的完整性約束都沒有被破壞,事務執行的前後都是合法的資料狀態。

例如,完整性約束了a+b=10,乙個事務改變了a,那麼b也應該隨之改變

i(isolation)-隔離性

隔離性就是說每個事務之間的操作應該相互隔離,互不干擾。比如說乙個事務提交之前對另乙個事務不可見。

隔離是乙個相對抽象而複雜的概念,比如說事務之間的隔離性我們到底要隔離到哪種程度呢?所以,針對隔離,sql92標準定義了4種隔離級別,這個放在後面事務的隔離級別中介紹。

d(durable)-永續性

事務一旦完成資料就會永久性的儲存在資料庫 不會隨之丟失

檢視事物是否提交

show variables like 'autocommit'

select @@autocommit

開啟關閉事物

set autocommit = 'off'

set @@autocommit = 0

不過需要注意的是,這種修改方式只是在當前會話視窗生效,對其他會話視窗是不生效的,mysql幾乎所有變數設定都會分成兩個級別,session(會話)和global(全域性)級別,預設就是session級別。

常用的事務控制語句

start transaction或者begin:顯示的開啟事務。需要注意的是在儲存過程中只能用start transaction開啟事務,因為儲存過程本來有begin…end語法,兩者會衝突。

commit:提交事務。也可以寫成commit work。

rollback:回滾事務。也可以寫成rollback work。

髒讀

事務a 提交一條資料但是未commit資料 這時候事務b讀取到了事物a未提交的髒資料,造成了髒讀。-乙個事務讀取到另乙個事務未提交的資料

不可重複讀

事務a 第一次讀取到了資料a=1 -> 事務b對資料a進行了更改 a=2並提交 -> 事務a 第二次讀取到的資料a=2 造成兩次讀取到的資料不一致 不可重複讀幻讀

事物a 第一次通過條件查詢 出一批資料 a = 1 b = 2 此時 -> 事務b 提交了一條資料c =3(或刪除了一條) -> 事務a 再次通過條件查詢 多了一條資料 c = 3(或者少了一條資料) 造成了幻讀

幻讀和不可重複讀很容易造成記憶混亂 幻讀主要是針對新增刪除 造成其他事務 多讀或者少讀了資料 不可重複讀主要是對同一條資料前後讀取到了不同的內容 重複讀資料不一致

sql 標準定義了四種隔離級別,mysql 全都支援。這四種隔離級別分別是:

讀未提交

可以讀取到其他事未提交的資料 這樣會造成 髒讀 不可重複讀 幻讀 一般不推薦使用 最低的隔離級別

讀已提交

只能讀取到其他事務已經提交的資料,這樣可以避免髒讀 但是任然會造成不可重複讀和幻讀 大多數資料使用的這個隔離級別 但是mysql不是

可重複讀

mysql預設的隔離級別 保證了同乙個事務多次讀取 結果都是一樣的 可以避免 髒讀 和不可重複讀 但是任然不能避免 幻讀 (innodb引擎例外,innodb引擎通過間隙鎖解決了幻讀問題)。

序列化

最高的隔離級別 對事務來說相當於按順序同步執行 效率來說是最低的 他會在讀取的時候給每乙個行加鎖,所以可能導致大量的超時和鎖爭用的情況,只有在非常需要確保資料的一致性而且可以接受沒有併發的情況下才考慮的級別。

隔離級別

髒讀不可重複讀

幻讀讀未提交(read uncommitted)

可能可能

可能讀已提交(read-committed)

不可能可能

可能可重複讀 (repeatable-read)

不可能不可能

可能可序列化 (serializable)

不可能不可能

不可能mvcc,多版本的併發控制,英文全稱:multi version concurrency control。就是當我們在修改資料的時候,可以為這條資料建立乙個快照,後面就可以直接讀取這個快照。

在聚簇索引中每條資料存在兩條隱藏列 乙個是事務id 乙個是回滾指標 回滾指標對應著undolog中的回滾日誌 在 undolog中有一條回滾資料的回滾鏈資料回滾就是靠這個來實現的

讀已提交的實現機制和可重複的的區別是讀取檢視的方式不一致

事物 a 插入資料

name

agetrn_id

roll_point張三1

1null

事物b 讀取資料

name

agetrn_id

roll_point張三1

2null

MySQL事務及事務隔離級別

原子性 atomicity 事務是乙個原子操作單元,其對資料的修改,要麼全都執行,要麼全都不執行。一致性 consistent 在事務開始和完成時,資料都必須保持一致狀態。這意味著所有相關的資料規則都必須應用於事務的修改,以保持資料的完整性 事務結束時,所有的內部資料結構 如b樹索引或雙向鍊錶 也都...

mysql 事務及隔離級別

原子性 回滾日誌 undo log 永續性 重做日誌 redo log 隔離性 鎖 一致性 通過aid及使用者自定義完整性保證 一致性是事務追求的最終目標 前面提到的原子性 永續性和隔離性,都是為了保證資料庫狀態的一致性。此外,除了資料庫層面的保障,一致性的實現也需要應用層面進行保障。一致性是指事務...

MYSQL事務及隔離級別

二,事務的四大特性 三,事務隔離級別 1,第一正規化資料庫中每一列都是不可再分的2,第二正規化非主鍵字段依賴主鍵字段。3,第三正規化非主鍵字段不能相互依賴當我需要執行多個sql語句的時候,我們會使用事務,這幾個sql語句會一起執行,要麼全成功,要麼全失敗。原子性 事務所有操作當作乙個原子性的操作。事...