• Spring声明式事务配置


    Spring声明式事务配置

    一、事务管理的目的

    事务管理是为了保证数据的完整性和一致性

    二、事务的特性

    1、原子性(atomicity)

    事务是原子性操作,由一系列动作组成,事务的原子性确保动作要么全部完成,要么完全不起作用

    2、一致性(consistency)

    一旦所有事务动作完成,事务就要被提交。数据和资源处于一种满足业务规则的一致性状态中

    3、隔离性(isolation)

    可能多个事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏

    4、持久性(durability)

    事务一旦完成,无论系统发生什么错误,结果都不会受到影响。通常情况下,事务的结果被写到持久化存储器中

    三、Spring中事务的实现方式

    1.编程式事务

    需要在代码中调用beginTransaction()、commit()、rollback()等事务管理相关的方法

    2.声明式事务

    Spring中通过Spring AOP实现声明式事务管理

    四、Spring中事务管理器

    Spring事务管理器的接口是org.springframework.transaction.PlatformTransactionManager,通过这个接口,Spring为JDBC、Hibernate等都提供了对应的事务管理器

    1.JDBC事务

        <!--配置声明式事务-->
        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource"/>
        </bean>
    

    2.通知声明式地管理事务并结合AOP实现事务的织入

        <!--结合AOP实现事务的织入-->
        <!--配置事务通知-->
        <tx:advice id="txAdvice" transaction-manager="transactionManager">
            <!--给哪些方法配置事务-->
            <!--配置事务的传播特性-->
            <tx:attributes>
                <tx:method name="add" propagation="REQUIRED"/>
                <tx:method name="delete" propagation="REQUIRED"/>
                <tx:method name="update" propagation="REQUIRED"/>
                <tx:method name="query" read-only="true"/>
                <tx:method name="*" propagation="REQUIRED"/>
            </tx:attributes>
        </tx:advice>
    
        <!--配置事务切入-->
        <!--把事务切入点和事务属性关联起来 -->
        <aop:config>
            <aop:pointcut id="txPointCut" expression="execution(* com.hx.mapper.*.*(..))"/>
            <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/>
        </aop:config>
    

    五、Spring事务的传播特性

    ①REQUIRED:如果有事务在运行,当前的方法就在这个事务内运行,否则就开启一个新的事务,并在自己的事务内运行,默认传播行为
    ②REQUIRED_NEW:当前方法必须启动新事务,并在自己的事务内运行,如果有事务正在运行,则将它挂起
    ③SUPPORTS:如果有事务在运行,当前的方法就在这个事务内运行,否则可以不运行在事务中
    ④NOT_SUPPORTED:表示该方法不应该运行在事务中。如果存在当前事务,在该方法运行期间,当前事务将被挂起。如果使用JTATransactionManager的话,则需要访问TransactionManager
    ⑤MANDATORY:当前的方法必须运行在事务内部,如果没有正在运行的事务,就会抛出异常
    ⑥NEVER:当前方法不应该运行在事务中,如果有运行的事务,就抛出异常
    ⑦NESTED:如果有事务在运行,当前的方法就应该在这个事务的嵌套事务内运行。嵌套的事务可以独立于当前事务进行单独地提交或回滚。如果当前事务不存在,那么其行为与PROPAGATION_REQUIRED一样

    六、Spring事务隔离级别

    spring中事务的隔离级别可以通过一下隔离属性指定
    ①DEFAULT:使用底层数据库的默认隔离级别,大部分数据库,默认隔离级别都是READ_COMMITED
    ②READ_COMMITED:只允许事务读取已经被其他事务提交的更改,可以避免脏读,但不可重复读和幻读问题仍然可能出现
    ③READ_UNCOMMITED:允许事务读取未被其他事务提交的更改。脏读,不可重复读,幻读都可能会出现
    ④REPEATABLE_READ:确保事务可以多次从一个字段中读取相同的值。在这个事务持续期间,禁止其他事务对这个字段进行更新,可以避免脏读和不可重复读,但是幻读的问题依然存在
    ⑤SERIALIZABLE:确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其他事务对该表执行插入,更新,删除。所有的并发问题都能避免,但是性能比较低。

    七、事务的回滚规则

    默认情况下只有未检查异常(RuntimeException和Error类型的异常)会导致事务回滚

    八、使用注解声明式管理事务

    @Transactional

    为了将方法定义为支持事务处理,可以在方法上添加@Transactional注解。根据Spring AOP基于代理机制,只能标注公有方法,如果在类上标注@Transactional注解,那么这个类中所有公有方法都会被定义为支持事务。

    步骤

    1.配置事务管理

        <!--配置声明式事务管理-->
        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource"/>
        </bean>
    

    2.在方法上加上@Transactional注解即可

  • 相关阅读:
    第三次作业,结对编程
    第二次作业
    第一次作业
    最小环问题
    拓扑排序——烦人的幻灯片
    拓扑排序——奖金
    洛谷——P2330 [SCOI2005] 繁忙的都市
    洛谷——P2820 局域网
    最小生成树——最短网络Agri-Net
    最小生成树——城市公交网建设问题
  • 原文地址:https://www.cnblogs.com/huangxuannn/p/15702502.html
Copyright © 2020-2023  润新知