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注解即可

posted @ 2021-12-31 17:04  AboutChristopher  阅读(421)  评论(0编辑  收藏  举报