04Spring事务控制

事务控制实现方式有:

  • 编程式事务控制:自己手动创建对象,编写事务控制代码
  • 基于XML的声明式事务控制:通过配置文件完成
  • 基于注解的声明式事务控制:通过注解完成

编程式

spring提供的事务管理器接口PlatformTransactionManager,不同的DAO层技术有不同的实现类(如 jdbc/mybatis/hibernate),该接口的方法有:

  • 获取事务的状态信息(getTransactionStatus(TransactionDefinition)
  • 提交事务(commit(status)
  • 回滚事务(rollback(status)

编程式事务控制的三大对象:

  1. PlatformTransactionManager平台事务管理接口:不同平台实现了不一样的类
  2. TransactionDefinition事务定义
    • 方法包括:设置事务级别、设置事务传播行为
  3. TransactionStatus事务运行状态
    • 方法包括:是否存储回滚点、事务是否完成、是否是新事物、事务是否回滚

事务控制理解:Spring框架事务控制管理是基于AOP实现的

  • 业务可以看做切点(被增强方法),事务可以看做通知(增强方法)
  • 配置切面:xml或者注解

基于XML

  1. 导入坐标spring-context aspectjweaver spring-jdbc spring-tx spring-test druid
  2. 创建数据表account(name, money)
  3. 创建domain模板
  4. 创建dao层,实现和数据库的简单交互 (in 转出钱, out 转入钱)
  5. 创建service层,实现业务逻辑 (transfer一个账转到另一个账号,该方法算是一个事务)
  6. 创建测试方法,调用service方法
  7. 配置xml,重要内容如下:
    • 定义一个事务管理(配置事务管理器)
    • 配置通知(配置事务),里面指定切点(service业务逻辑)
    • 织入:将切点和通知结合
<!--平台事务管理器,从dataSource中获取一个conn-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>

<!--通知:增强方法,也就是事务-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <!--事务定义-->
    <tx:attributes>
        <!--切点1:transfer方法-->
        <tx:method name="transfer"/>
        <!--切点2:查询方法-->
        <tx:method name="findAll"/>
        <!--切点3:更新方法,可以使用通配符-->
        <tx:method name="update*"/>
    </tx:attributes>
</tx:advice>

<!--事务织入-->
<aop:config>
    <!--事务织入就用advisor,其他织入可以用aspect-->
    <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.service.impl.*.*(..))"/>
</aop:config>

在配置切点时,有几个参数可以配置

<tx:method name="xx">
1. name: 切点方法名称
2. isolation: 事务隔离级别
3. propogation: 事务传播行为
4. timeout: 超时时间
5. read-only: 是否只读

基于注解

配置文件如下:

  • 组件扫描
  • 事务管理器
  • 事务的注解驱动
<!--组件扫描-->
<context:component-scan base-package="com"/>
<!--平台事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>
<!--事务的注解驱动:让事务注解起作用-->
<tx:annotation-driven transaction-manager="transactionManager"/>

注解:

  • 各个层的类上添加组件注解(@Componet, @Autowired等)
  • 在需要添加事务的方法上添加事务注解@Transactional

事务注解注意:

  • @Transactional关于事务的参数和xml一样
  • 可以用在类上,那么该类下所有方法使用同一套注解配置
原文地址:https://www.cnblogs.com/mingriyingying/p/13639516.html