事務所具有的四種特性
原子性,一致性,隔離性,永續性
原子性
個人理解,就是事務執行不可分割,要麼全部完成,要麼全部拉倒不幹。
一致性
關於一致性這個概念我們來舉個例子說明吧,假設張三給李四轉了100元,那麼需要先從張三那邊扣除100,然後李四那邊增加100,這個轉賬的過程對於其他事務而言是無法看到的,這種狀態始終都在保持一致,這個過程我們稱之為一致性。
隔離性
併發訪問資料庫時,乙個使用者的事務不被其他事務所干擾,各併發事務之間資料是獨立的;
永續性
乙個事務被提交之後。它對資料庫中資料的改變是持久的,即使資料庫發生故障也不應該對其有任何影響。
七種事務的傳播機制
事務的七種傳播機制分別為:
required(預設)預設的事務傳播機制,如果當前不支援事務,那麼就建立乙個新的事務。
supports表示支援當前的事務,如果當前沒有事務,則不會單獨建立事務
requires_new
定義:建立乙個新事務,如果當前事務已經存在,把當前事務掛起。
* 1.標誌requires_new會新開啟事務,外層事務不會影響內部事務的提交/回滾not_supported定義:當前方法不應該有事務,如果有事務存在,將它掛起,以無事務狀態執行。* 2.標誌requires_new的內部事務的異常,會影響外部事務的回滾
nested
定義:如果有事務執行,就作為這個事務的巢狀事務執行; 如果沒有事務執行,新建乙個事務執行;
* nested和required_new的區別:mandatory定義:mandatory單詞中文翻譯為強制,支援使用當前事務,如果當前事務不存在,則丟擲exception。* 假設都是在乙個required型別的事務裡呼叫這些事務,該required型別方法呼叫丟擲異常,required_new的方法仍然可以提交,
* 但是nested還要受到required事務回滾而被迫回滾;
never
定義:當前如果存在事務則丟擲異常
read-uncommitted(讀未提交):會讀取其他事務未提交的資料
read-committed(讀已提交、不可重複讀):不會讀取其他事務未提交的資料,但 在同一事物裡,兩次查詢會出現不同結果(其他事務在兩次讀取之間提交了修改的語句,就會發生不可重複讀)
repeatable_read(可重複讀):在同一事物裡,兩次查詢不會出現不同結果, 但 在同一事物裡,兩次查詢會出現不同結果(其他事務在兩次讀取之間提交了新增的語句,並且本事務全域性修改了表,就會發生幻讀)
serializable(序列化):會把整個表都鎖住
所謂的髒讀是指讀取到沒有提交的資料資訊。
所謂的不可重複讀,我的理解是,多個執行緒a,b同時讀取資料庫裡面的資料,a執行緒負責插入資料,b執行緒負責寫入資料,b執行緒裡面有兩次讀取資料庫的操作,分別是select1和select2,由於事務的隔離級別設定在了transaction_read_committed,所以當select1執行了之後,a執行緒插入了新的資料,再去執行select2操作的時候會讀取出新的資料資訊,導致出現了不可重複讀問題。
幻讀與不可重複讀類似。它發生在乙個事務(t1)讀取了幾行資料,接著另乙個併發事務(t2)插入了一些資料時。在隨後的查詢中,第乙個事務(t1)就會發現多了一些原本不存在的記錄,就好像發生了幻覺一樣,所以稱為幻讀。
事務的傳播屬性和隔離級別
事務的傳播屬性和隔離級別是比較常見的面試題,下面就來總結一下。spring提供了7種傳播屬性,如下 傳播屬性 描述required 如果有事務執行,當前的方法就在這個事務內執行,否則,就開啟乙個新的事務,並在自己的事務內執行 requires new 當前的方法必須開啟新事務,並在它自己的事務內執行...
Spring事務傳播屬性和隔離級別
當事務方法被另乙個事務方法呼叫時,必須指定事務應該如何傳播。例如 方法可能繼續在現有事務中執行,也可能開啟乙個新事務,並在自己的事務中執行 事務的傳播行為可以由傳播屬性指定 spring 定義了7種類傳播行為 傳播屬性 描述required 常用 如果有事務在執行,當前的方法就在這個事務內執行,否則...
闡述事務的隔離級別和傳播屬性
七個事務傳播屬性 propagation required 支援當前事務,如果當前沒有事務,就新建乙個事務。這是最常見的選擇。propagation supports 支援當前事務,如果當前沒有事務,就以非事務方式執行。propagation mandatory 支援當前事務,如果當前沒有事務,就丟...