spring_事務管理 原

事務的併發問題

事務的併發問題含義產生原因
髒讀一個事務讀取到另一個事務未提交的數據另一個事務執行了操作,但還未提交
不可重複讀一個事務因讀取到另一個事務已提交的數據。導致對同一條記錄讀取兩次以上的結果不一致另一個事務發生update操作
幻讀一個事務因讀取到另一個事務已提交的數據。導致對同一張表讀取兩次以上的結果不一致另一個事務發生insert,delete操作

事務隔離級別

事務隔離級別含義
Read uncommitted (讀未提交)最低級別,任何情況都無法保證
Read committed (讀已提交)避免髒讀
Repeatable read (可重複讀)避免髒讀,不可重複讀
Serializable (串行化)可避免髒讀,不可重複讀,幻讀

spring事務管理

Spring並不直接管理事務,而是提供了多種事務管理器,他們將事務管理的職責委託給Hibernate或者JTA等持久化機制所提供的相關平臺框架的事務來實現。 Spring事務管理器的接口是PlatformTransactionManager,通過這個接口,Spring爲各個平臺如JDBC、Hibernate等都提供了對應的事務管理器,但是具體的實現就是各個平臺自己的事情了。

PlatformTransactionManager接口: 平臺事務管理器.(真正管理事務的類)。該接口有具體的實現類,根據不同的持久層框架,需要選擇不同的實現類;

TransactionDefinition接口: 事務定義信息(事務的隔離級別,傳播行爲,超時,只讀);

TransactionStatus接口: 事務的狀態(是否新事務、是否已提交、是否有保存點、是否回滾)

PlatformTransactionManager接口的實現類:

DataSourceTransactionManager: Spring的JDBC模板或者MyBatis(IBatis)框架使用;

HibernateTransactionManager: Hibernate使用(由Hibernate實現);

spring中7種事務傳播行爲

事務傳播行爲:解決的是業務層之間的方法調用問題。

spring事務傳播機制含義
PROPAGATION_REQUIRED(默認值)如果當前沒有事務,就新建一個事務,如果已經存在一個事務中,加入到這個事務中。
PROPAGATION_SUPPORTS支持當前事務,如果當前沒有事務,就以非事務方式執行。
PROPAGATION_MANDATORY使用當前的事務,如果當前沒有事務,就拋出異常。
PROPAGATION_REQUIRES_NEW新建事務,如果當前存在事務,把當前事務掛起。
PROPAGATION_NOT_SUPPORTED以非事務方式執行操作,如果當前存在事務,就把當前事務掛起,就是使用兩個不同事務的意思.
PROPAGATION_NEVER以非事務方式執行,如果當前存在事務,則拋出異常。
PROPAGATION_NESTED如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則執行與PROPAGATION_REQUIRED類似的操作。

事務傳播行爲參考: https://segmentfault.com/a/1190000013341344

Spring編程式事務管理

一般不推薦使用spring的編程事務管理。 但spring提供了模板類TransactionTemplate,支持以編程的方式來管理事務。 需要將TransactionTemplate注入到IOC容器中:

<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
    <property name="transactionManager" ref="transactionManager"/>
</bean>

Spring聲明式事務管理

Spring的聲明式事務管理其實就是利用AOP實現的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章