'Java面試題:Spring事務面試考點的集合整理。建議收藏閱讀'

Java 數據庫 跳槽那些事兒 收藏 MySQL 讀書 程序員 Java架構師技術 2019-08-15
"

Spring和事務的關係

關係型數據庫、某些消息隊列等產品或中間件稱為事務性資源,因為它們本身支持事務,也能夠處理事務。

Spring很顯然不是事務性資源,但是它可以管理事務性資源,所以Spring和事務之間是管理關係。

就像Jack Ma雖然不會寫代碼,但是他卻管理者一大批會寫代碼的碼農。

"

Spring和事務的關係

關係型數據庫、某些消息隊列等產品或中間件稱為事務性資源,因為它們本身支持事務,也能夠處理事務。

Spring很顯然不是事務性資源,但是它可以管理事務性資源,所以Spring和事務之間是管理關係。

就像Jack Ma雖然不會寫代碼,但是他卻管理者一大批會寫代碼的碼農。

Java面試題:Spring事務面試考點的集合整理。建議收藏閱讀


Spring事務三要素

數據源:表示具體的事務性資源,是事務的真正處理者,如MySQL等。

事務管理器:像一個大管家,從整體上管理事務的處理過程,如打開、提交、回滾等。

事務應用和屬性配置:像一個標識符,表明哪些方法要參與事務,如何參與事務,以及一些相關屬性如隔離級別、超時時間等。


Spring事務的註解配置

把一個DataSource(如DruidDataSource)作為一個@Bean註冊到Spring容器中,配置好事務性資源。

把一個@EnableTransactionManagement註解放到一個@Configuration類上,配置好事務管理器,並啟用事務管理。

把一個@Transactional註解放到類上或方法上,可以設置註解的屬性,表明該方法按配置好的屬性參與到事務中。


事務註解的本質

@Transactional這個註解僅僅是一些(和事務相關的)元數據,在運行時被事務基礎設施讀取消費,並使用這些元數據來配置bean的事務行為。

大致來說具有兩方面功能,一是表明該方法要參與事務,二是配置相關屬性來定製事務的參與方式和運行行為。

"

Spring和事務的關係

關係型數據庫、某些消息隊列等產品或中間件稱為事務性資源,因為它們本身支持事務,也能夠處理事務。

Spring很顯然不是事務性資源,但是它可以管理事務性資源,所以Spring和事務之間是管理關係。

就像Jack Ma雖然不會寫代碼,但是他卻管理者一大批會寫代碼的碼農。

Java面試題:Spring事務面試考點的集合整理。建議收藏閱讀


Spring事務三要素

數據源:表示具體的事務性資源,是事務的真正處理者,如MySQL等。

事務管理器:像一個大管家,從整體上管理事務的處理過程,如打開、提交、回滾等。

事務應用和屬性配置:像一個標識符,表明哪些方法要參與事務,如何參與事務,以及一些相關屬性如隔離級別、超時時間等。


Spring事務的註解配置

把一個DataSource(如DruidDataSource)作為一個@Bean註冊到Spring容器中,配置好事務性資源。

把一個@EnableTransactionManagement註解放到一個@Configuration類上,配置好事務管理器,並啟用事務管理。

把一個@Transactional註解放到類上或方法上,可以設置註解的屬性,表明該方法按配置好的屬性參與到事務中。


事務註解的本質

@Transactional這個註解僅僅是一些(和事務相關的)元數據,在運行時被事務基礎設施讀取消費,並使用這些元數據來配置bean的事務行為。

大致來說具有兩方面功能,一是表明該方法要參與事務,二是配置相關屬性來定製事務的參與方式和運行行為。

Java面試題:Spring事務面試考點的集合整理。建議收藏閱讀


Spring聲明式事務實現原理

聲明式事務成為可能,主要得益於Spring AOP。使用一個事務攔截器,在方法調用的前後/周圍進行事務性增強(advice),來驅動事務完成。


如何回滾一個事務

就是在一個事務上下文中當前正在執行的代碼裡拋出一個異常,事務基礎設施代碼會捕獲任何未處理的異常,並且做出決定是否標記這個事務為回滾。


默認回滾規則

默認只把runtime, unchecked exceptions標記為回滾,即RuntimeException及其子類,Error默認也導致回滾。Checked exceptions默認不導致回滾。這些規則和EJB是一樣的。


如何配置回滾異常

使用@Transactional註解的rollbackFor/rollbackForClassName屬性,可以精確配置導致回滾的異常類型,包括checked exceptions。

noRollbackFor/noRollbackForClassName屬性,可以配置不導致回滾的異常類型,當遇到這樣的未處理異常時,照樣提交相關事務。


事務註解在類/方法上

@Transactional註解既可以標註在類上,也可以標註在方法上。當在類上時,默認應用到類裡的所有方法。如果此時方法上也標註了,則方法上的優先級高。


事務註解在類上的繼承性

@Transactional註解的作用可以傳播到子類,即如果父類標了子類就不用標了。但倒過來就不行了。

子類標了,並不會傳到父類,所以父類方法不會有事務。父類方法需要在子類中重新聲明而參與到子類上的註解,這樣才會有事務。

"

Spring和事務的關係

關係型數據庫、某些消息隊列等產品或中間件稱為事務性資源,因為它們本身支持事務,也能夠處理事務。

Spring很顯然不是事務性資源,但是它可以管理事務性資源,所以Spring和事務之間是管理關係。

就像Jack Ma雖然不會寫代碼,但是他卻管理者一大批會寫代碼的碼農。

Java面試題:Spring事務面試考點的集合整理。建議收藏閱讀


Spring事務三要素

數據源:表示具體的事務性資源,是事務的真正處理者,如MySQL等。

事務管理器:像一個大管家,從整體上管理事務的處理過程,如打開、提交、回滾等。

事務應用和屬性配置:像一個標識符,表明哪些方法要參與事務,如何參與事務,以及一些相關屬性如隔離級別、超時時間等。


Spring事務的註解配置

把一個DataSource(如DruidDataSource)作為一個@Bean註冊到Spring容器中,配置好事務性資源。

把一個@EnableTransactionManagement註解放到一個@Configuration類上,配置好事務管理器,並啟用事務管理。

把一個@Transactional註解放到類上或方法上,可以設置註解的屬性,表明該方法按配置好的屬性參與到事務中。


事務註解的本質

@Transactional這個註解僅僅是一些(和事務相關的)元數據,在運行時被事務基礎設施讀取消費,並使用這些元數據來配置bean的事務行為。

大致來說具有兩方面功能,一是表明該方法要參與事務,二是配置相關屬性來定製事務的參與方式和運行行為。

Java面試題:Spring事務面試考點的集合整理。建議收藏閱讀


Spring聲明式事務實現原理

聲明式事務成為可能,主要得益於Spring AOP。使用一個事務攔截器,在方法調用的前後/周圍進行事務性增強(advice),來驅動事務完成。


如何回滾一個事務

就是在一個事務上下文中當前正在執行的代碼裡拋出一個異常,事務基礎設施代碼會捕獲任何未處理的異常,並且做出決定是否標記這個事務為回滾。


默認回滾規則

默認只把runtime, unchecked exceptions標記為回滾,即RuntimeException及其子類,Error默認也導致回滾。Checked exceptions默認不導致回滾。這些規則和EJB是一樣的。


如何配置回滾異常

使用@Transactional註解的rollbackFor/rollbackForClassName屬性,可以精確配置導致回滾的異常類型,包括checked exceptions。

noRollbackFor/noRollbackForClassName屬性,可以配置不導致回滾的異常類型,當遇到這樣的未處理異常時,照樣提交相關事務。


事務註解在類/方法上

@Transactional註解既可以標註在類上,也可以標註在方法上。當在類上時,默認應用到類裡的所有方法。如果此時方法上也標註了,則方法上的優先級高。


事務註解在類上的繼承性

@Transactional註解的作用可以傳播到子類,即如果父類標了子類就不用標了。但倒過來就不行了。

子類標了,並不會傳到父類,所以父類方法不會有事務。父類方法需要在子類中重新聲明而參與到子類上的註解,這樣才會有事務。

Java面試題:Spring事務面試考點的集合整理。建議收藏閱讀


事務註解在接口/類上

@Transactional註解可以用在接口上,也可以在類上。在接口上時,必須使用基於接口的代理才行,即JDK動態代理。

事實是Java的註解不能從接口繼承,如果你使用基於類的代理,即CGLIB,或基於織入方面,即AspectJ,事務設置不會被代理和織入基礎設施認出來,目標對象不會被包裝到一個事務代理中。

Spring團隊建議註解標註在類上而非接口上。


只在public方法上生效?

當採用代理來實現事務時,(注意是代理),@Transactional註解只能應用在public方法上。當標記在protected、private、package-visible方法上時,不會產生錯誤,但也不會表現出為它指定的事務配置。可以認為它作為一個普通的方法參與到一個public方法的事務中。

如果想在非public方法上生效,考慮使用AspectJ(織入方式)。


目標類裡的自我調用沒有事務?

在代理模式中(這是默認的),只有從外部的方法調用進入通過代理會被攔截,這意味著自我調用(實際就是,目標對象中的一個方法調用目標對象的另一個方法)在運行時不會導致一個實際的事務,即使被調用的方法標有註解。

如果你希望自我調用也使用事務來包裝,考慮使用AspectJ的方式。在這種情況下,首先是沒有代理。相反,目標類被織入(即它的字節碼被修改)來把@Transactional加入到運行時行為,在任何種類的方法上都可以。


事務與線程

和JavaEE事務上下文一樣,Spring事務和一個線程的執行相關聯,底層是一個ThreadLocal<Map<Object, Object>>,就是每個線程一個map,key是DataSource,value是Connection。


邏輯事務與物理事務

事務性資源實際打開的事務就是物理事務,如數據庫的Connection打開的事務。Spring會為每個@Transactional方法創建一個事務範圍,可以理解為是邏輯事務。

在邏輯事務中,大範圍的事務稱為外圍事務,小範圍的事務稱為內部事務,外圍事務可以包含內部事務,但在邏輯上是互相獨立的。每一個這樣的邏輯事務範圍,都能夠單獨地決定rollback-only狀態。

那麼如何處理邏輯事務和物理事務之間的關聯關係呢,這就是傳播特性解決的問題。

"

Spring和事務的關係

關係型數據庫、某些消息隊列等產品或中間件稱為事務性資源,因為它們本身支持事務,也能夠處理事務。

Spring很顯然不是事務性資源,但是它可以管理事務性資源,所以Spring和事務之間是管理關係。

就像Jack Ma雖然不會寫代碼,但是他卻管理者一大批會寫代碼的碼農。

Java面試題:Spring事務面試考點的集合整理。建議收藏閱讀


Spring事務三要素

數據源:表示具體的事務性資源,是事務的真正處理者,如MySQL等。

事務管理器:像一個大管家,從整體上管理事務的處理過程,如打開、提交、回滾等。

事務應用和屬性配置:像一個標識符,表明哪些方法要參與事務,如何參與事務,以及一些相關屬性如隔離級別、超時時間等。


Spring事務的註解配置

把一個DataSource(如DruidDataSource)作為一個@Bean註冊到Spring容器中,配置好事務性資源。

把一個@EnableTransactionManagement註解放到一個@Configuration類上,配置好事務管理器,並啟用事務管理。

把一個@Transactional註解放到類上或方法上,可以設置註解的屬性,表明該方法按配置好的屬性參與到事務中。


事務註解的本質

@Transactional這個註解僅僅是一些(和事務相關的)元數據,在運行時被事務基礎設施讀取消費,並使用這些元數據來配置bean的事務行為。

大致來說具有兩方面功能,一是表明該方法要參與事務,二是配置相關屬性來定製事務的參與方式和運行行為。

Java面試題:Spring事務面試考點的集合整理。建議收藏閱讀


Spring聲明式事務實現原理

聲明式事務成為可能,主要得益於Spring AOP。使用一個事務攔截器,在方法調用的前後/周圍進行事務性增強(advice),來驅動事務完成。


如何回滾一個事務

就是在一個事務上下文中當前正在執行的代碼裡拋出一個異常,事務基礎設施代碼會捕獲任何未處理的異常,並且做出決定是否標記這個事務為回滾。


默認回滾規則

默認只把runtime, unchecked exceptions標記為回滾,即RuntimeException及其子類,Error默認也導致回滾。Checked exceptions默認不導致回滾。這些規則和EJB是一樣的。


如何配置回滾異常

使用@Transactional註解的rollbackFor/rollbackForClassName屬性,可以精確配置導致回滾的異常類型,包括checked exceptions。

noRollbackFor/noRollbackForClassName屬性,可以配置不導致回滾的異常類型,當遇到這樣的未處理異常時,照樣提交相關事務。


事務註解在類/方法上

@Transactional註解既可以標註在類上,也可以標註在方法上。當在類上時,默認應用到類裡的所有方法。如果此時方法上也標註了,則方法上的優先級高。


事務註解在類上的繼承性

@Transactional註解的作用可以傳播到子類,即如果父類標了子類就不用標了。但倒過來就不行了。

子類標了,並不會傳到父類,所以父類方法不會有事務。父類方法需要在子類中重新聲明而參與到子類上的註解,這樣才會有事務。

Java面試題:Spring事務面試考點的集合整理。建議收藏閱讀


事務註解在接口/類上

@Transactional註解可以用在接口上,也可以在類上。在接口上時,必須使用基於接口的代理才行,即JDK動態代理。

事實是Java的註解不能從接口繼承,如果你使用基於類的代理,即CGLIB,或基於織入方面,即AspectJ,事務設置不會被代理和織入基礎設施認出來,目標對象不會被包裝到一個事務代理中。

Spring團隊建議註解標註在類上而非接口上。


只在public方法上生效?

當採用代理來實現事務時,(注意是代理),@Transactional註解只能應用在public方法上。當標記在protected、private、package-visible方法上時,不會產生錯誤,但也不會表現出為它指定的事務配置。可以認為它作為一個普通的方法參與到一個public方法的事務中。

如果想在非public方法上生效,考慮使用AspectJ(織入方式)。


目標類裡的自我調用沒有事務?

在代理模式中(這是默認的),只有從外部的方法調用進入通過代理會被攔截,這意味著自我調用(實際就是,目標對象中的一個方法調用目標對象的另一個方法)在運行時不會導致一個實際的事務,即使被調用的方法標有註解。

如果你希望自我調用也使用事務來包裝,考慮使用AspectJ的方式。在這種情況下,首先是沒有代理。相反,目標類被織入(即它的字節碼被修改)來把@Transactional加入到運行時行為,在任何種類的方法上都可以。


事務與線程

和JavaEE事務上下文一樣,Spring事務和一個線程的執行相關聯,底層是一個ThreadLocal<Map<Object, Object>>,就是每個線程一個map,key是DataSource,value是Connection。


邏輯事務與物理事務

事務性資源實際打開的事務就是物理事務,如數據庫的Connection打開的事務。Spring會為每個@Transactional方法創建一個事務範圍,可以理解為是邏輯事務。

在邏輯事務中,大範圍的事務稱為外圍事務,小範圍的事務稱為內部事務,外圍事務可以包含內部事務,但在邏輯上是互相獨立的。每一個這樣的邏輯事務範圍,都能夠單獨地決定rollback-only狀態。

那麼如何處理邏輯事務和物理事務之間的關聯關係呢,這就是傳播特性解決的問題。

Java面試題:Spring事務面試考點的集合整理。建議收藏閱讀


事務的傳播特性

REQUIRED,SUPPORTS,MANDATORY,REQUIRES_NEW,NOT_SUPPORTED,NEVER,NESTED

REQUIRED

強制要求要有一個物理事務。如果沒有已經存在的事務,就專門打開一個事務用於當前範圍。或者參與到一個已存在的更大範圍的外圍事務中。在相同的線程中,這是一種很好的默認方式安排。(例如,一個service外觀/門面代理到若干個倉儲方法,所有底層資源必須參與到service級別的事務裡)

在標準的REQUIRED行為情況下,所有這樣的邏輯事務範圍映射到同一個物理事務。因此,在內部事務範圍設置了rollback-only標記,確實會影響外圍事務進行實際提交的機會。

:默認,一個參與到外圍事務的事務,會使用外圍事務的特性,安靜地忽略掉自己的隔離級別,超時值,只讀標識等設置。當然可以在事務管理器上設置validateExistingTransactions標識為true,這樣當你自己的事務和參與到的外圍事務設置不一樣時會被拒絕。

REQUIRES_NEW

與REQUIRED相比,總是使用一個獨立的物理事務用於每一個受影響的邏輯事務範圍,從來不參與到一個已存在的外圍事務範圍。這樣安排的話,底層的事務資源是不同的,因此,可以獨立地提交或回滾。外圍事務不會被內部事務的回滾狀態影響。這樣一個獨立的內部事務可以聲明自己的隔離級別,超時時間和只讀設置,並不繼承外圍事務的特性。

NESTED

使用同一個物理事務,帶有多個保存點,可以回滾到這些保存點,可以認為是部分回滾,這樣一個內部事務範圍觸發了一個回滾,外圍事務能夠繼續這個物理事務,儘管有一些操作已經被回滾。典型地,它對應於JDBC的保存點,所以只對JDBC事務資源起作用。

SUPPORTS

支持當前事務。如果當前有事務,就參與進來,如果沒有,就以非事務的方式運行。這樣的一個邏輯事務範圍,它背後可能沒有實際的物理事務,此時的事務也成為空事務。

NOT_SUPPORTED

不支持當前事務。總是以非事務方式運行。當前的事務會被掛起,並在適合的時候恢復。

MANDATORY

支持當前事務。如果當前沒有事務存在,就拋出異常。

NEVER

不支持當前事務。如果當前有事務存在,就拋出異常。

事務的隔離級別

DEFAULT,READ_UNCOMMITTED,READ_COMMITTED,REPEATABLE_READ,SERIALIZABLE

"

Spring和事務的關係

關係型數據庫、某些消息隊列等產品或中間件稱為事務性資源,因為它們本身支持事務,也能夠處理事務。

Spring很顯然不是事務性資源,但是它可以管理事務性資源,所以Spring和事務之間是管理關係。

就像Jack Ma雖然不會寫代碼,但是他卻管理者一大批會寫代碼的碼農。

Java面試題:Spring事務面試考點的集合整理。建議收藏閱讀


Spring事務三要素

數據源:表示具體的事務性資源,是事務的真正處理者,如MySQL等。

事務管理器:像一個大管家,從整體上管理事務的處理過程,如打開、提交、回滾等。

事務應用和屬性配置:像一個標識符,表明哪些方法要參與事務,如何參與事務,以及一些相關屬性如隔離級別、超時時間等。


Spring事務的註解配置

把一個DataSource(如DruidDataSource)作為一個@Bean註冊到Spring容器中,配置好事務性資源。

把一個@EnableTransactionManagement註解放到一個@Configuration類上,配置好事務管理器,並啟用事務管理。

把一個@Transactional註解放到類上或方法上,可以設置註解的屬性,表明該方法按配置好的屬性參與到事務中。


事務註解的本質

@Transactional這個註解僅僅是一些(和事務相關的)元數據,在運行時被事務基礎設施讀取消費,並使用這些元數據來配置bean的事務行為。

大致來說具有兩方面功能,一是表明該方法要參與事務,二是配置相關屬性來定製事務的參與方式和運行行為。

Java面試題:Spring事務面試考點的集合整理。建議收藏閱讀


Spring聲明式事務實現原理

聲明式事務成為可能,主要得益於Spring AOP。使用一個事務攔截器,在方法調用的前後/周圍進行事務性增強(advice),來驅動事務完成。


如何回滾一個事務

就是在一個事務上下文中當前正在執行的代碼裡拋出一個異常,事務基礎設施代碼會捕獲任何未處理的異常,並且做出決定是否標記這個事務為回滾。


默認回滾規則

默認只把runtime, unchecked exceptions標記為回滾,即RuntimeException及其子類,Error默認也導致回滾。Checked exceptions默認不導致回滾。這些規則和EJB是一樣的。


如何配置回滾異常

使用@Transactional註解的rollbackFor/rollbackForClassName屬性,可以精確配置導致回滾的異常類型,包括checked exceptions。

noRollbackFor/noRollbackForClassName屬性,可以配置不導致回滾的異常類型,當遇到這樣的未處理異常時,照樣提交相關事務。


事務註解在類/方法上

@Transactional註解既可以標註在類上,也可以標註在方法上。當在類上時,默認應用到類裡的所有方法。如果此時方法上也標註了,則方法上的優先級高。


事務註解在類上的繼承性

@Transactional註解的作用可以傳播到子類,即如果父類標了子類就不用標了。但倒過來就不行了。

子類標了,並不會傳到父類,所以父類方法不會有事務。父類方法需要在子類中重新聲明而參與到子類上的註解,這樣才會有事務。

Java面試題:Spring事務面試考點的集合整理。建議收藏閱讀


事務註解在接口/類上

@Transactional註解可以用在接口上,也可以在類上。在接口上時,必須使用基於接口的代理才行,即JDK動態代理。

事實是Java的註解不能從接口繼承,如果你使用基於類的代理,即CGLIB,或基於織入方面,即AspectJ,事務設置不會被代理和織入基礎設施認出來,目標對象不會被包裝到一個事務代理中。

Spring團隊建議註解標註在類上而非接口上。


只在public方法上生效?

當採用代理來實現事務時,(注意是代理),@Transactional註解只能應用在public方法上。當標記在protected、private、package-visible方法上時,不會產生錯誤,但也不會表現出為它指定的事務配置。可以認為它作為一個普通的方法參與到一個public方法的事務中。

如果想在非public方法上生效,考慮使用AspectJ(織入方式)。


目標類裡的自我調用沒有事務?

在代理模式中(這是默認的),只有從外部的方法調用進入通過代理會被攔截,這意味著自我調用(實際就是,目標對象中的一個方法調用目標對象的另一個方法)在運行時不會導致一個實際的事務,即使被調用的方法標有註解。

如果你希望自我調用也使用事務來包裝,考慮使用AspectJ的方式。在這種情況下,首先是沒有代理。相反,目標類被織入(即它的字節碼被修改)來把@Transactional加入到運行時行為,在任何種類的方法上都可以。


事務與線程

和JavaEE事務上下文一樣,Spring事務和一個線程的執行相關聯,底層是一個ThreadLocal<Map<Object, Object>>,就是每個線程一個map,key是DataSource,value是Connection。


邏輯事務與物理事務

事務性資源實際打開的事務就是物理事務,如數據庫的Connection打開的事務。Spring會為每個@Transactional方法創建一個事務範圍,可以理解為是邏輯事務。

在邏輯事務中,大範圍的事務稱為外圍事務,小範圍的事務稱為內部事務,外圍事務可以包含內部事務,但在邏輯上是互相獨立的。每一個這樣的邏輯事務範圍,都能夠單獨地決定rollback-only狀態。

那麼如何處理邏輯事務和物理事務之間的關聯關係呢,這就是傳播特性解決的問題。

Java面試題:Spring事務面試考點的集合整理。建議收藏閱讀


事務的傳播特性

REQUIRED,SUPPORTS,MANDATORY,REQUIRES_NEW,NOT_SUPPORTED,NEVER,NESTED

REQUIRED

強制要求要有一個物理事務。如果沒有已經存在的事務,就專門打開一個事務用於當前範圍。或者參與到一個已存在的更大範圍的外圍事務中。在相同的線程中,這是一種很好的默認方式安排。(例如,一個service外觀/門面代理到若干個倉儲方法,所有底層資源必須參與到service級別的事務裡)

在標準的REQUIRED行為情況下,所有這樣的邏輯事務範圍映射到同一個物理事務。因此,在內部事務範圍設置了rollback-only標記,確實會影響外圍事務進行實際提交的機會。

:默認,一個參與到外圍事務的事務,會使用外圍事務的特性,安靜地忽略掉自己的隔離級別,超時值,只讀標識等設置。當然可以在事務管理器上設置validateExistingTransactions標識為true,這樣當你自己的事務和參與到的外圍事務設置不一樣時會被拒絕。

REQUIRES_NEW

與REQUIRED相比,總是使用一個獨立的物理事務用於每一個受影響的邏輯事務範圍,從來不參與到一個已存在的外圍事務範圍。這樣安排的話,底層的事務資源是不同的,因此,可以獨立地提交或回滾。外圍事務不會被內部事務的回滾狀態影響。這樣一個獨立的內部事務可以聲明自己的隔離級別,超時時間和只讀設置,並不繼承外圍事務的特性。

NESTED

使用同一個物理事務,帶有多個保存點,可以回滾到這些保存點,可以認為是部分回滾,這樣一個內部事務範圍觸發了一個回滾,外圍事務能夠繼續這個物理事務,儘管有一些操作已經被回滾。典型地,它對應於JDBC的保存點,所以只對JDBC事務資源起作用。

SUPPORTS

支持當前事務。如果當前有事務,就參與進來,如果沒有,就以非事務的方式運行。這樣的一個邏輯事務範圍,它背後可能沒有實際的物理事務,此時的事務也成為空事務。

NOT_SUPPORTED

不支持當前事務。總是以非事務方式運行。當前的事務會被掛起,並在適合的時候恢復。

MANDATORY

支持當前事務。如果當前沒有事務存在,就拋出異常。

NEVER

不支持當前事務。如果當前有事務存在,就拋出異常。

事務的隔離級別

DEFAULT,READ_UNCOMMITTED,READ_COMMITTED,REPEATABLE_READ,SERIALIZABLE

Java面試題:Spring事務面試考點的集合整理。建議收藏閱讀


髒讀

一個事務修改了一行數據但沒有提交,第二個事務可以讀取到這行被修改的數據,如果第一個事務回滾,第二個事務獲取到的數據將是無效的。


不可重複讀

一個事務讀取了一行數據,第二個事務修改了這行數據,第一個事務重新讀取這行數據,將獲得到不同的值。

幻讀

一個事務按照一個where條件讀取所有符合的數據行,第二個事務插入了一行數據且恰好也滿足這個where條件,第一個事務再以這個where條件重新讀取,將會獲取額外多出來的這一行。

幫助記憶

寫讀是髒讀,讀寫讀是不可重複讀,where insert where是幻讀。

DEFAULT

使用底層數據存儲的默認隔離級別。MySQL的默認隔離級別是REPEATABLE-READ。

READ_UNCOMMITTED

讀未提交。髒讀、不可重複讀、幻讀都會發生。

READ_COMMITTED

讀已提交。髒讀不會發生,不可重複讀、幻讀都會發生。

REPEATABLE_READ

可重複讀。髒讀、不可重複讀都不會發生,幻讀會發生。

SERIALIZABLE

可串行化。髒讀、不可重複讀、幻讀都不會發生。


"

相關推薦

推薦中...