乙個事務是乙個完整的業務邏輯單元,不能再分,要麼全部執行成功,要麼全部失敗。
比如:a給b轉賬100元,a的銀行卡就會少100元,b的銀行卡就會多100元,整個過程要麼全部執行成功,要麼全部失敗。
a:原子性。事務是最小的業務邏輯單元。
b:一致性。乙個事務必須保證多條dml語句同時成功或失敗。
c:隔離性。兩個事務之間具有隔離性(隔離級別問題)
d:永續性。最終的資料必須持久化到硬碟中,乙個事務才算最終完成。
(1)read_uncommitted(讀未提交)
可讀取未提交事務的運算元據,最低的隔離級別,一般都沒有用的。這種情況會出現髒讀。
(2)read_committed(讀已提交)
乙個事務等另乙個事務提交之後才可進行讀取,解決了髒讀問題,但會出現不可重複讀
(3)repeatable_read(可重複讀)
讀取事務開啟的時候不能對資料進行修改,解決了不可重複讀問題,但是存在幻讀問題;
(4)serializable(序列化):是最高的事務隔離級別,可以避免髒讀、不可重複讀與幻讀。但是這種事務隔離級別效率低下,比較耗資料庫效能,一般不使用;
可以根據需求設定資料庫的事務的級別。「讀未提交」一般沒用,「讀已提交」解決髒讀但存在不可重複讀,「可重複讀」解決了髒讀和不可重複讀,但會出現幻讀。序列化讀,都可以解決,但是需要注意的是事務級別越高效能越低。
mysql預設第三隔離級別。
oracle預設第二隔離級別。
高併發情況下,事務可能出現的幾種情況:髒讀、幻讀、不可重複讀
1、髒讀
出現原因:乙個事務讀取到了快取中另乙個事務未提交的髒資料。
說明:當事務b對data進行了修改但是未提交事務,此時事務a對data進行讀取,並使用事務b修改的資料做業務處理。
2、幻讀
出現原因:乙個事務在讀取資料時,另乙個事務插入了資料,導致上個事務第二次讀取資料時,資料不一致。
說明:data 表有一條資料,事務a對data進行讀取, 事務b對data進行資料新增 ,此時事務a讀取只有一條資料,而最後實際data是有兩條資料,就好象發生了幻覺一樣情況成為幻讀;
3、不可重複讀
出現原因:讀取資料的同時可以進行修改;
說明:事務a、事務b同時對data進行訪問,事務a對data進行讀取,事務b對data進行修改,當事務a第一次對data進行讀取完後事務b提交,此時當事務a第二次讀取該資料時的資料就與第一次讀取的資料不同,這種情況稱為不可重複讀;
第一級別:出現髒讀、幻讀、不可重複讀
第二級別:出現幻讀、不可重複讀
第**別:出現幻讀
第四級別:都解決了
事務的隔離級別舉例 JDBC 事務隔離級別
本文總結了 jdbc 事務隔離級別。事務隔離級別定義了在乙個事務中,哪些資料是對當前執行的語句 可見 的。在併發訪問資料庫時,事務隔離級別定義了多個事務之間對於同個目標資料來源訪問時的可交叉程度。可交叉程度可分為以下幾類。可交叉程度 dirty reads 髒讀 當乙個事務能看見另外乙個事務未提交的...
事務的隔離級別舉例 JDBC事務隔離級別
一組要麼同時執行成功,要麼同時執行失敗的sql語句。是資料庫操作的乙個執行單元。斷開與資料庫的連線 表示乙個事務內的所有操作是乙個整體,要麼全部成功,要麼全部失敗 表示乙個事務內有乙個操作失敗時,所有的更改過的資料都必須回滾到修改前狀態 事務檢視資料時資料所處的狀態,要麼是另一併發事務修改它之前的狀...
事務的隔離級別舉例 事務,事務隔離級別,傳播行為
什麼是事務 事務是訪問資料庫的乙個操作序列,資料庫應用系統通過事務集來完成對資料庫的訪問。事務的正確執行使得資料庫從一種狀態轉換為另一種狀態,事務須服從acid原則 原子性 事務要麼全部被執行,要麼全部不執行。成功則資料庫狀態發生變化,失敗則不會發生狀態轉換 一致性 使資料庫從一種正確狀態轉換成另外...