Spring中事務的隔離級別和傳播行為

2021-10-01 14:12:54 字數 1369 閱讀 2433

事務的隔離級別是指若干個併發的事務之間的隔離程度。

在spring中,事務的隔離級別有五種設定方式(isolation屬性的設定方式):

隔離級別

說明default

使用資料庫本身使用的隔離級別:oracle(讀已提交) mysql(可重複讀)

read_uncomitted

讀未提交(髒讀),最低的隔離級別。

read_comitted

讀已提交。oracle預設隔離級別,有不可重複讀和幻讀的風險。

repeatable_read

可重複讀,mysql預設隔離級別,有幻讀的風險

serlalizable

序列化,最高的隔離級別。不管多少事務,依次執行完乙個事務的所有子事務之後,才可以執行另外乙個事務裡面的所有子事務。解決了髒讀、不可重複讀和幻讀的問題。但是消耗大,效能不高。

事務的傳播行為用於指定在多個事務方法間呼叫時,事務是如何在這些方法間傳播的。

在spring中,事務有7中傳播行為:

傳播行為

說明propagation_requierd

如果當前沒有事務,就新建乙個事務,如果已存在乙個事務,則加入到這個事務中,這是最常見的選擇 。即:如果methoda()方法中沒有事務,methodb()方法中有事務,則methodb()中開啟乙個事務;如果methoda()方法有事務,則methodb()加入methoda()的事務中,不需要再開啟乙個事務。

propagation_supports

支援當前事務,如果沒有當前事務,就以非事務方法執行。即:如果methoda()方法中有事務,methodb()方法中有事務;如果methoda()方法沒有事務,methodb()方法中有事務,那麼methodb()異常不回滾。

propagation_mandatory

使用當前事務時,如果沒有當前事務,就丟擲異常。即:如果methoda()方法中有事務,methodb()有事務;如果methodb()方法中沒有事務,methodb()方法中有事務,methodb()異常回滾。

propagation_required_new

新建事務,如果當前存在事務,把當前事務掛起

propagation_not_supported

以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。

propagation_never

以非事務方式執行操作,如果當前事務存在則丟擲異常。

propagation_nested

如果當前存在事務,則在巢狀事務內執行。如果當前沒有事務,則執行與propagation_required類似的操作

注意:requires_new和nested的區別:

Spring中的事務隔離級別

事務隔離級別定義乙個事務可能受其他事務併發活動的影響程度。另乙個考慮事務隔離級別的角度,是把它想象為事務對於它處理的資料的自私程度。事務的隔離要解決的問題有3個 1,髒讀,即乙個事務讀到另乙個事務還沒有提交的資料。如果另乙個事務失敗了,回滾了,那麼第乙個事務讀到的資料就是無效的資料。這就是髒讀。2,...

spring事務隔離級別

在spring中定義了5中不同的事務隔離級別 1.isolation default 一般情況下使用這種配置既可 這是乙個platfromtransactionmanager預設的隔離級別,使用資料庫預設的事務隔離級別。2.isolation read uncommitted 4 p l.i f k...

Spring 事務隔離級別

資料庫事務的隔離級別有4種,由低到高分為為read uncomitted,read comitted,repeatable read serializable,而且,在事務的併發操作中可能會出現髒讀,不可重複度,虛讀 幻讀 髒讀 read uncomitted 什麼都防不住 乙個事務讀到另外乙個事務...