事務的特性和隔離級別

1.什麼是事務?

事務就是由一條或多條SQL操作組成的一個不可分割的工作單元。只有當事務中的所有操作都完成後,這個事務纔會被提交;只要有一個操作沒有完成,那麼這個事務就會被回滾。(簡單理解,就是要麼全部執行,要麼全部不執行;)

2. 事務特性

事務有四個特性(ACID)

原子性(A):事務中的所有SQL語句操作是一個不可分割的單元;要麼全部執行,要麼全部不執行。

一致性(C):事務執行前後要使數據保持一直狀態。(例如,A有200元,B有100元,A給B轉賬,轉賬結束後,A和B的資金綜合應該還是300元;數據應該保持一致。)

隔離性(I):一個事務的操作不影響另一個事務的操作,兩個併發執行的事務之間是相互隔離的。

持久性(D):一個事務被提交後,對數據庫中數據的改變是永久的。提交後的其他操作或故障不會對它有影響。

3. 事務的隔離級別

事務有四個隔離級別:讀未提交、讀已提交、可重複讀、序列化。

Read Uncommitted

讀未提交:事務A可以讀取事務B還沒有提交的數據。這就是髒讀

那麼怎麼解決髒讀呢?這就需要用到讀已提交。

Read Committed

讀已提交:事務A必須等到事務B把數據提交後才能讀取數據。比如,事務A先去讀取數據庫數據,得到一個結果a;與此同時,事務B去數據庫update數據,並且事務A再次讀取數據,這樣的情況下,事務A的讀操作必須等到事務B的update操作提交以後才能執行,這樣就解決了髒讀問題,但此時事務A再去讀取數據庫數據時,會得到一個結果b;在一次事務裏,兩次讀取結果不同,這就是不可重複讀問題。

那麼怎麼解決不可重複讀問題呢?這就需要用到可重複讀。

Repeatable Read

可重複讀:可重複讀就是在事務A開啓讀操作後(事務開啓),不能進行事務B的update操作。但是可以進行事務B的insert操作;舉例,事務A開啓讀操作,得到結果a,這時事務B插入一條數據,事務A再次讀取數據,得到結果b,兩次讀取結果不一樣,給人一種幻覺,這就是幻讀的問題。

那麼如何解決幻讀問題?使用序列化!

Serializable

序列化:序列化就是隻允許事務一個接一個地執行,不允許事務併發執行;序列化可以解決髒讀、不可重複讀、幻讀的問題。但是,序列化是事務的最高隔離級別,效率低下,比較耗數據庫的性能,一般不推薦使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章