Spring——事務管理

Spring中的事務管理

一、什麼是事務

  • 是數據庫操做的最小工做單元,是做爲單個邏輯工做單元執行的一系列操做;
  • 這些操做做爲一個總體一塊兒向系統提交,要麼都執行、要麼都不執行;
  • 事務是一組不可再分割的操做集合(工做邏輯單元)

在Spring中,事務就是將一組業務當作一個業務來執行,要麼所有成功,要麼所有失敗,不能破壞數據的完整性。java

二、事務的特性

  • 原子性(Atomicity):事務是一個原子操做,由一系列動做組成。事務的原子性確保動做要麼所有完成,要麼徹底不起做用。
  • 一致性(Consistency):一旦事務完成(無論成功仍是失敗),系統必須確保它所建模的業務處於一致的狀態,要麼所有完成要麼所有失敗。事務操做的實際數據不該該被破壞。
  • 隔離性(Isolation):可能有許多事務會同時處理相同的數據,所以每一個事務都應該與其餘事務隔離開來,防止數據損壞。
  • 持久性(Durability):一旦事務完成,不管發生什麼系統錯誤,它的結果都不該該受到影響,這樣就能從任何系統崩潰中恢復過來。一般狀況下,事務的結果被寫到持久化存儲器中。

三、標準配置

要開啓 Spring 的事務處理功能,在 Spring 的配置文件中建立一個 DataSourceTransactionManager 對象:spring

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <constructor-arg ref="dataSource" />
</bean>

或 Java類使用註解的方式注入:sql

@Bean
public DataSourceTransactionManager transactionManager() {
  return new DataSourceTransactionManager(dataSource());
}

傳入的 DataSource 能夠是任何可以與 Spring 兼容的 JDBC DataSource。包括鏈接池和經過 JNDI 查找得到的 DataSource數據庫

注意:爲事務管理器指定的 DataSource 必須和用來建立 SqlSessionFactoryBean 的是同一個數據源,不然事務管理器就沒法工做了。express

四、聲明式事務(交由容器管理事務)

想讓 Spring 參與到容器管理事務的過程當中,那麼 Spring 應該被設置爲使用 JtaTransactionManager 或由容器指定的一個子類做爲事務管理器。最簡單的方式是使用 Spring 的事務命名空間:apache

<tx:jta-transaction-manager />

或使用JtaTransactionManagerFactoryBeansession

@Bean
public JtaTransactionManager transactionManager() {
  return new JtaTransactionManagerFactoryBean().getObject();
}

方式一:給SqlSessionFactory注入Spring事務管理器ManagedTransactionFactory:

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  <property name="dataSource" ref="dataSource" />
  <property name="transactionFactory">
    <bean class="org.apache.ibatis.transaction.managed.ManagedTransactionFactory" />
  </property>  
</bean>

或:mybatis

@Bean
public SqlSessionFactory sqlSessionFactory() {
  SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
  factoryBean.setDataSource(dataSource());
  factoryBean.setTransactionFactory(new ManagedTransactionFactory());
  return factoryBean.getObject();
}

方式二:結合AOP實現事務的織入(一般使用)

<!--Spring配置聲明式事務-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <constructor-arg ref="dataSource" />
</bean>

<!--基於AOP實現事務織入-->
<!--配置事務通知-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <!--給哪些方法配置事務-->
    <!--配置事務的傳播特性: propagation-->
    <tx:attributes>
        <tx:method name="*" propagation="REQUIRED"/>
    </tx:attributes>
</tx:advice>

<!--配置事務切入點-->
<aop:config>
    <aop:pointcut id="txPointCut" expression="execution(* com.spong.mapper.*.*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/>
</aop:config>

五、Spring中七種Propagation類的事務屬性詳解:

REQUIRED:支持當前事務,若是當前沒有事務,就新建一個事務。這是最多見的也是默認選擇。app

SUPPORTS:支持當前事務,若是當前沒有事務,就以非事務方式執行。code

MANDATORY:支持當前事務,若是當前沒有事務,就拋出異常。

REQUIRES_NEW:新建事務,若是當前存在事務,把當前事務掛起。

NOT_SUPPORTED:以非事務方式執行操做,若是當前存在事務,就把當前事務掛起。

NEVER:以非事務方式執行,若是當前存在事務,則拋出異常。

NESTED:支持當前事務,若是當前事務存在,則執行一個嵌套事務,若是當前沒有事務,就新建一個事務。


若有錯誤,歡迎大佬指正!

相關文章
相關標籤/搜索