我們常聽到事務隔離級別這個概念,而又分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 這四種隔離級別所能提供的事務處理能力各不相同。這些事務隔離級別是針對三種現象定義的,在併發事務執行時,需要阻止這三種現象 中的一種或多種發生。三種...