事務隔離級別(spring database)

2021-10-08 05:52:45 字數 2008 閱讀 4543

我們常聽到事務隔離級別這個概念,而又分spring事務隔離級別和資料庫事務隔離級別,那麼它們分別是什麼?並且有什麼關係呢?

常量解釋

isolation_default

這是個 platfromtransactionmanager 預設的隔離級別,使用資料庫預設的事務隔離級別。另外四個與 jdbc 的隔離級別相對應。

isolation_read_uncommitted

事務中的修改,即使沒有提交,其他事務也可以看得到,會導致「髒讀」、「幻讀」和「不可重複讀取」

isolation_read_committed

大多數主流資料庫的預設事務等級,避免了「髒讀取」,但不能避免「幻讀」和「不可重複讀取」,sql server和oracle資料庫預設的隔離級別

isolation_repeatable_read

避免了「髒讀取」和「不可重複讀取」的情況,但不能避免「幻讀」 ,mysql資料庫預設的隔離級別

isolation_serializable

事務被處理為序列化順序執行,代價最大,很少用

spring事務

使用spring難免要用到spring的事務管理,要用事務管理又會很自然的選擇宣告式的事務管理;

spring宣告式事務管理

spring宣告式事務管理預設對非檢查型異常執行時異常進行事務回滾,而對檢查型異常則不進行回滾操作。

那麼什麼是檢查型異常什麼又是非檢查型異常呢?

最簡單的判斷點有兩個:

@transactional

(rollbackfor=exception.

class

)//預設只有執行時異常才事務回滾

@transactional

(notrollbackfor=runtimeexception.

class

)//非執行時異常才事務回滾

@transactional

(propagation=propagation.not_supported)

//不需要事務管理的(只查詢的)方法

隔離級別

隔離級別的值

導致的問題

read-uncommitted

0導致髒讀

read-committed

1避免髒讀,允許不可重複讀和幻讀

repeatable-read

2避免髒讀,不可重複讀,允許幻讀

serializable

3序列化讀,事務只能乙個乙個執行,避免了髒讀、不可重複讀、幻讀。執行效率慢,使用時慎重

為什麼會出現「髒讀」?

因為沒有「select」操作沒有規矩。

為什麼會出現「不可重複讀」?

因為「update」操作沒有規矩。

為什麼會出現「幻讀」?

因為「insert」和「delete」操作沒有規矩。

spring預設使用的隔離級別是isolation_default,隨資料庫預設的隔離級別;而spring事務本質上使用資料庫事務,而資料庫事務本質上使用資料庫鎖,所以spring事務本質上使用資料庫鎖,開啟spring事務意味著使用資料庫鎖;

通過mvcc(multi version concurrent control)多版本併發控制機制來控制的,mysql資料庫上其實每條上面都還有兩個冗餘字段,乙個是行的建立版本,乙個是行的刪除(過期)版本。具體的版本號(trx_id)存在 information_schema.innodb_trx 表中。版本號(trx_id)隨著每次事務的開啟自增。

原理:將歷史資料存乙份快照,所以其他事務增加與刪除資料,對於當前事務來說是不可見的。

事務隔離級別

1 serializable 最嚴格的spring事務隔離級別,事務序列執行,資源消耗最大 3 read committed 大多數主流資料庫的預設spring事務隔離等級,保證了乙個事務不會讀到另乙個並行事務已修改但未提交的資料,避免了 髒讀取 該級別適用於大多數系統。4 read uncommi...

事務隔離級別

四種隔離級別 隔離級別 髒 讀不可重複讀取 幻 像讀操作未提交 read uncommitted 是是 是讀操作已提交 read committed 否是 是可重複讀 repeatable read 否否 是快照否否 否可序列讀 serializable 否否 否 sql server 還支援使用行...

事務隔離級別

需要防止的現象和事務隔離級別 ansi iso sql 標準 sql92 定義了四種事務隔離級別 transaction isolation level 這四種隔離級別所能提供的事務處理能力各不相同。這些事務隔離級別是針對三種現象定義的,在併發事務執行時,需要阻止這三種現象 中的一種或多種發生。三種...