spring(六)事务管理

一、Spring事务管理API

1.1、事务管理器接口

事务管理器是PlateformTransactionManager接口对象。主要用于事务提交、回滚、事务状态信息查询。

PlateformTransactionManager接口常用实现类:DataSourceTransactionManager,使用JDBC或者Mybatis操作数据库时使用。

spring事务默认回滚方式:发生异常或者error时回滚,发生受查(编译)异常提交。不过受查异常,程序员也可以手工设置其回滚方式。

1.2、事务定义接口

TransactionDefinition中定义了事务描述中相关三类常量:事务隔离级别、事务传播行为、事务默认超时时限以及对他们的操作。

1.2.1、事务隔离级别常量

这些常量均以 ISOLATION_ 开头

  • DEFAULT: DB默认事务隔离级别,Mysql默认为REPEATABLE_READ,Oracle默认为READ_COMMITTED。
  • READ_UNCOMMITTED:读未提交,未解决任何并发。
  • READ_COMMITTED:读已提交,解决脏读,存在不可重复读与幻读。
  • REPEATABLE_READ:可重复度,解决脏读,不可重复度,未解决幻读。
  • SERIALIZABLE:串行化,不存在并发。

1.2.2、事务传播行为常量

事务传播行为是指:处于不同事务的方法相互调用,执行期间任务的维护情况。如:A事务中doSome()调用B事务中doOther(),在调用期间事务的维护情况,就称为事务传播行为,事务传播行为加在方法上的。

事务的传播行为常量以 PROPAGATION_ 开头。

  • Propagation.REQUIRED:当前没有事务时候就会创建一个事务,如果存在事务直接加入该事务,比较常用设置
  • Propagation.SUPPORTS:支持当前事务,如果当前存在事务,就直接加入该事务,否则就以非事务方式执行
  • Propagation.MANDATORY:支持当前事务,如果当前存在事务,就直接加入该事务,否则抛出异常
  • Propagation.REQUIRES_NEW:创建新事务,无论当前是否有事务都会创建新事务

1.2.3、默认事务超时时限

TIMEOUT_DEFAULT定义了事务底层默认超时时限,sql语句执行时长。

事务超时时限起作用条件比较多,且超时时间点计算比较复杂,所以改值一般使用默认值。

二、声明式事务控制

Spring提供的对事务控制,就叫做声明式事务控制。使用声明式事务控制,在配置文件中配置即可:不想使用时直接移除配置即可。这种方式实现了对事务控制的最大程度解耦。

声明式事务控制的核心基于AOP。

  • spring提供了对事务的管理,开发者需要按照spring的方式去操作。
  • 事务必须在service层统一控制
  • 事务的粗细粒度:细粒度,对代码中的几行开启事务提交回滚;粗粒度,对整个方法开启提交回滚。
  • spring中的aop只能对方法进行拦截,所以我们也就针对方法进行事务控制。
  • 单条语句查询可以省略事务,多条语句查询必须开启事务。

2.1、基于注解的事务

@Service
public class GradeService {

    @Autowired
    private GradeDao gradeDao;

    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
    public Boolean insert(Grade grade){
        Boolean aBoolean = gradeDao.insert(grade);
        System.out.println("第一次执行结果:"+aBoolean);
        int num=1/0;
        Boolean bBoolean = gradeDao.insert(grade);
        System.out.println("第二次执行结果:"+bBoolean);
        return bBoolean;
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
    <!--  数据源  -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="com.mysql.cj.jdbc.Driver"/>
        <property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/testdb?serverTimezone=UTC&amp;characterEncoding=utf8&amp;useUnicode=true&amp;useSSL=false"/>
        <property name="user" value="root"/>
        <property name="password" value="123@qwe"/>
    </bean>
    <!--  jdbcTemplate  -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <!--  dao类  -->
    <bean id="gradeDao" class="com.jsonliu.test.dao.GradeDao">
        <property name="jdbcTemplate" ref="jdbcTemplate" />
    </bean>
    <!--注解扫描-->
    <context:component-scan base-package="com.jsonliu.test"/>
    <!--注入事务管理器-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <!--启用事务管理器-->
    <tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
    @Test
    public void test4(){
        ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
        GradeService gradeService = (GradeService) context.getBean("gradeService");
        Grade grade = new Grade("化神期");
        Boolean insert = gradeService.insert(grade);
        System.out.println("执行结果:"+insert);
    }

2.2、基于XML的事务管理

添加如下配置:

 <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="insert*" propagation="REQUIRED"/>
            <tx:method name="add*" propagation="REQUIRED"/>
            <tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
        </tx:attributes>
    </tx:advice>

    <aop:config>
        <aop:pointcut id="pt" expression="execution(* com.jsonliu.test.service..*.*(..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="pt"/>
    </aop:config>
相关推荐

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页

打赏作者

笑谈子云亭

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值