事务

1. 回顾事务

  • 要么都成功,要么都失败
  • 因为涉及到数据的一致性问题,十分重要
  • 确保完整性,一致性

事务的ACID:

  • 原子性(事物不可再分)
  • 一致性(从一个状态切换到另一个状态)
  • 隔离性(一个操作不会影响另一个操作)
    • 多个业务操作一个资源,要保证事务互相隔离,防止数据损坏
  • 持久性(造成的结果是永久的)
    • 事务一旦提交,无论发生什么问题,结果都不会再受影响,被持久的写到存储器中

这四个性质保证了事务的ACID

为什么需要事务?

  • 如果不配置事务,可能存在数据不一致的问题
  • 如果不在Spring中配置事务,我们就需要在代码中手动配置事务。
  • 事务在开发中十分重要,涉及到数据的一致性和完整性。

2. pring中的事务管理

  • 声明式事务
  • 编程式事务(会改变原有代码)

开启事务管理器

<!--配置声明式事务-->
<bean id="transactionManger" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <constructor-arg ref="dataSouece"/>
</bean>

结合AOP实现AOP织入(可以看作切面方法或者环绕增强的方法)

<!--结合AOP实现AOP织入-->
<!--配置事务通知-->
<tx:advice id="txAdvice" transaction-manager="transactionManger">
    <!--给哪些方法配置事务-->
    <!--配置事务的传播特性:propagation-->
    <!--这里可以写add*,delete*等-->
    <tx:attributes>
        <tx:method name="add*" propagation="REQUIRED"/>
        <tx:method name="delete*" propagation="REQUIRED"/>
        <tx:method name="update*" propagation="REQUIRED"/>
        <tx:method name="select*" read-only="true"/>
    </tx:attributes>
</tx:advice>

配置事务切入

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

步骤总结:

  1. 先导入tx和aop的约束和依赖
  2. 首先开启事务管理器
  3. 进行AOP织入,对哪些方法怎么使用事务进行配置(propagation)
  4. 接下来就是进行事务切入,确定要切入的方法,确定切入的tx和切入点

醉后不知天在水,满船清梦压星河