Spring 中的事務隔離級別和資料庫中的事務隔離級別稍有不同,以 MySQL 為例,MySQL 的 InnoDB 引擎中的事務隔離級別有 4 種,而 Spring 中卻包含了 5 種事務隔離級別。
事務隔離級別是對事務 4 大特性中隔離性的具體體現,使用事務隔離級別可以控制並行事務在同時執行時的某種行為。
比如,有兩個事務同時操作同一張表,此時有一個事務修改了這張表的資料,但尚未提交事務,那麼在另一個事務中,要不要(或者說能不能)看到其他事務尚未提交的資料呢?
這個問題的答案就要看事務的隔離級別了,不同的事務隔離級別,對應的行為模式也是不一樣的(有些隔離級別可以看到其他事務尚未提交的資料,有些事務隔離級別看不到其他事務尚未提交的資料),這就是事務隔離級別的作用。
Sping 中的事務隔離級別有 5 種,它們分別是:
所以,相比於 MySQL 的事務隔離級別,Spring 中多了一種 DEFAULT 的事務隔離級別。
事務隔離級別與問題的對應關係如下:
- 髒讀:一個事務讀取到了另一個事務修改的資料之後,後一個事務又進行了回滾操作,從而導致第一個事務讀取的資料是錯誤的。
- 不可重複讀:一個事務兩次查詢得到的結果不同,因為在兩次查詢中間,有另一個事務把資料修改了。
- 幻讀:一個事務兩次查詢中得到的結果集不同,因為在兩次查詢中另一個事務有新增了一部分資料。
在 Spring 中,事務的隔離級別有 2 種設定方法,一種是在程式設計式事務中,可以通過以下程式碼來設定事務隔離級別:
另一種是在宣告式事務中設定事務隔離級別,設定方法如下:
Spring 中的事務隔離級別比 MySQL 中的事務隔離級別多了一種,它包含的 5 種隔離級別分別是:
但需要注意是 Spring 是事務隔離級別是建立在連線的資料庫支援事務的基礎上的,如果 Spring 專案連線的資料庫不支援事務(或事務隔離級別),那麼即使在 Spring 中設定了事務隔離級別,也是無效的設定。
是非審之於己,譭譽聽之於人,得失安之於數。
公眾號:Java面試真題解析