Spring声明式事务

Spring声明式事务

事务ACID原则

  1. 原子性 ==》事务是一个不可再分割的工作单位,事务中的操作要么都执行,要么都不执行

  2. 一致性 ==》一致性是指在执行一个事务前和后,数据库的完整性约束没有没有被破坏

  3. 隔离性 ==》隔离性是指多个事务并发时,每个事务应该是隔离的,一个事务不应影响其他事务的运行效果

    事务并发问题
    
    要了解事务的隔离级别,就要先了解事务并发会面临的问题
     1. 脏读:事务A读取了事务B的更新的数据,但是事务B回滚了,导致A读取的为脏数据。
     2. 不可重复读:事务A读取同一数据两次,但是在两次之间事务B对该数据进行了修改并提交,导致事务A读取两次读取不一致
     3. 幻读:所谓幻读,就是同一个事务,连续做两次当前读 (例如:select * from t1 where id = 10 for update;),那么这两次当前读返回的是不相同的记录
    
    注意:不可重复读和幻读很容易混淆,不可重复读针对的时数据的修改,幻读针对的时数据的新增和删除。解决不可重复读问题只需要给对应记录上行锁,而解决幻读需要对表加锁。
    
  4. 持久性 ==》事务一旦提交,系统发生任何问题,结果都不会改变,被持久化的写到存储中(例如数据库)

AOP配置声明式事务

<!-- 1. 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 2. 配置事务属性 -->
<!--<tx:advice>元素声明事务通知-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <!-- 根据方法名指定事务的属性 -->
        <tx:method name="*"/>
        <!--propagation配置事务传播行为-->
        <tx:method name="purchase" propagation="REQUIRES_NEW"/>
        <!--isolation配置事务的隔离级别-->
        <tx:method name="update*" isolation="SERIALIZABLE"/>
        <!--rollback-for配置事务遇到异常必须回滚,no-rollback-for配置事务遇到异常必须不能回滚-->
        <tx:method name="add*" rollback-for="java.io.IOException" no-rollback-for="com.dmsd.spring.tx.BookStockException"/>
        <!--read-only配置事务只读属性-->
        <tx:method name="find*" read-only="true"/>
        <!--timeout配置事务的超时属性-->
        <tx:method name="get*" timeout="3"/>
    </tx:attributes>
</tx:advice>

<!-- 3. 配置事务切入点, 以及把事务切入点和事务属性关联起来 -->
<aop:config>
    <aop:pointcut expression="execution(* com.atguigu.spring.tx.xml.service.*.*(..))" 
                  id="txPointCut"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/>	
</aop:config>
posted @ 2021-07-24 13:34  幸运刘  阅读(31)  评论(0)    收藏  举报