一、事務的基本要素(
acid
)
1
、原子性(
atomicity
):事務開始後所有操作,要麼全部做完,要麼全部不做,不可能停滯在中間環節。事務執行過程中出錯,會回滾到事務開始前的狀態,所有的操作就像沒有發生一樣。也就是說事務是乙個不可分割的整體,就像化學中學過的原子,是物質構成的基本單位。
2
、一致性(
consistency
):事務開始前和結束後,資料庫的完整性約束沒有被破壞
。比如a向b
轉賬,不可能
a扣了錢,
b卻沒收到。
3
、隔離性(
isolation
):同一時間,只允許乙個事務請求同一資料,不同的事務之間彼此沒有任何干擾。比如
a正在從一張銀行卡中取錢,在
a取錢的過程結束前,
b不能向這張卡轉賬。
4
、永續性(
durability
):事務完成後,事務對資料庫的所有更新將被儲存到資料庫,不能回滾。
二、事務的併發問題
1
、髒讀:事務
a讀取了事務
b更新的資料,然後
b回滾操作,那麼
a讀取到的資料是髒資料
2
、不可重複讀:事務
a 多次讀取同一資料,事務
b 在事務
a多次讀取的過程中,對資料作了更新並提交,導致事務
a多次讀取同一資料時,結果
不一致。
3
、幻讀:系統管理員
a將資料庫中所有學生的成績從具體分數改為
abcde
等級,但是系統管理員
b就在這個時候插入了一條具體分數的記錄,當系統管理員
a改結束後發現還有一條記錄沒有改過來,就好像發生了幻覺一樣,這就叫幻讀。
小結:不可重複讀的和幻讀很容易混淆,不可重複讀側重於
修改,幻讀側重於
新增或刪除
。解決不可重複讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表
三、mysql
事務隔離級別
事務隔離級別
髒讀不可重複讀
幻讀讀未提交(
read-uncommitted)是
是是不可重複讀(
read-committed)否
是是可重複讀(
repeatable-read)否
否是序列化(
serializable)否
否否補充:
1、sql規範所規定的標準,不同的資料庫具體的實現可能會有些差異
2、mysql中預設事務隔離級別是可重複讀時並不會鎖住讀取到的行
3、事務隔離級別為讀提交時,寫資料只會鎖住相應的行
4、事務隔離級別為可重複讀時,如果有索引(包括主鍵索引)的時候,以索引列為條件更新資料,會存在間隙鎖間隙鎖、行鎖、下一鍵鎖的問題,從而鎖住一些行;如果沒有索引,更新資料時會鎖住整張表。
5、事務隔離級別為序列化時,讀寫資料都會鎖住整張表
6、隔離級別越高,越能保證資料的完整性和一致性,但是對併發效能的影響也越大,魚和熊掌不可兼得啊。對於多數應用程式,可以優先考慮把資料庫系統的隔離級別設為read committed,它能夠避免髒讀取,而且具有較好的併發效能。儘管它會導致不可重複讀、幻讀這些併發問題,在可能出現這類問題的個別場合,可以由應用程式採用悲觀鎖或樂觀鎖來控制。
事務的隔離級別舉例 事務的隔離級別
乙個事務是乙個完整的業務邏輯單元,不能再分,要麼全部執行成功,要麼全部失敗。比如 a給b轉賬100元,a的銀行卡就會少100元,b的銀行卡就會多100元,整個過程要麼全部執行成功,要麼全部失敗。a 原子性。事務是最小的業務邏輯單元。b 一致性。乙個事務必須保證多條dml語句同時成功或失敗。c 隔離性...
事務的隔離級別舉例 JDBC 事務隔離級別
本文總結了 jdbc 事務隔離級別。事務隔離級別定義了在乙個事務中,哪些資料是對當前執行的語句 可見 的。在併發訪問資料庫時,事務隔離級別定義了多個事務之間對於同個目標資料來源訪問時的可交叉程度。可交叉程度可分為以下幾類。可交叉程度 dirty reads 髒讀 當乙個事務能看見另外乙個事務未提交的...
事務的隔離級別舉例 JDBC事務隔離級別
一組要麼同時執行成功,要麼同時執行失敗的sql語句。是資料庫操作的乙個執行單元。斷開與資料庫的連線 表示乙個事務內的所有操作是乙個整體,要麼全部成功,要麼全部失敗 表示乙個事務內有乙個操作失敗時,所有的更改過的資料都必須回滾到修改前狀態 事務檢視資料時資料所處的狀態,要麼是另一併發事務修改它之前的狀...