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:支持当前事务,若是当前事务存在,则执行一个嵌套事务,若是当前没有事务,就新建一个事务。


若有错误,欢迎大佬指正!

相关文章
相关标签/搜索