其他分享
首页 > 其他分享> > 声明式事务

声明式事务

作者:互联网

声明式事务

事务的控制交给Spring框架来管理,开发人员只需要在Spring框架的配置文件中声明你需要的功能即可。Spring框架底层基于AOP实现了声明式事务。
1、搭建环境

com.springsource.net.sf.cglib-2.2.0.jar
com.springsource.org.aopalliance-1.0.0.jar
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
commons-logging-1.1.3.jar
druid-1.1.9.jar
hamcrest-core-1.3.jar
junit-4.12.jar
mysql-connector-java-5.1.37-bin.jar
spring-aop-4.0.0.RELEASE.jar
spring-aspects-4.0.0.RELEASE.jar
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELEASE.jar
spring-core-4.0.0.RELEASE.jar
spring-expression-4.0.0.RELEASE.jar
spring-jdbc-4.0.0.RELEASE.jar
spring-orm-4.0.0.RELEASE.jar
spring-test-4.0.0.RELEASE.jar
spring-tx-4.0.0.RELEASE.jar

2,准备配置文件

<context:component-scan base-package="com.atguigu.spring.tx.component"/>
​
<!-- 导入外部属性文件 -->
<context:property-placeholder location="classpath:jdbc.properties" />
​
<!-- 配置数据源 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    <property name="driverClassName" value="${atguigu.dev.driver}"/>
    <property name="url" value="${atguigu.dev.url}"/>
    <property name="username" value="${atguigu.dev.username}"/>
    <property name="password" value="${atguigu.dev.password}"/>
</bean>
​
<!-- 配置JdbcTemplate -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <!-- 装配数据源 -->
    <property name="dataSource" ref="dataSource"/>
</bean>
<!-- 配置事务管理器的bean -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
​
    <!-- 给事务管理器装配数据源 -->
    <property name="dataSource" ref="dataSource"/>
</bean>
<!-- 开启声明式事务的注解驱动 -->
<!-- 在transaction-manager属性中指定前面配置的事务管理器的bean的id -->
<!-- transaction-manager属性的默认值是transactionManager,如果正好前面bean的id就是这个默认值,那么transaction-manager属性可以省略不配 -->
<tx:annotation-driven transaction-manager="transactionManager"/>

3,情景设定(假定总共有两条sql对一个表进行操作)
3.1EmpService方法

    @Override
    public void updateTwice() {
​
        // 1.准备第一次修改所需的数据
        Integer empId = 5;
        String empName = "AAA";
​
        // 2.执行第一次修改
        empDao.updateEmpName(empId, empName);
​
        // 3.准备第二次修改所需的数据
        empId = 6;
        empName = "BBB";
​
        // 4.执行第二次修改
        empDao.updateEmpName(empId, empName);
​
    }

4,EmpDao方法

    @Override
    public void updateEmpName(Integer empId, String empName) {
​
        if (empId == 6) {
            throw new RuntimeException("我故意的");
        }
​
        String sql = "update t_emp set emp_name=? where emp_id=?";
​
        jdbcTemplate.update(sql, empName, empId);
​
    }

5,在需要事务的方法上使用注解(一般是service)

    @Override
    @Transactional
    public void updateTwice() {
        // 1.准备第一次修改所需的数据
        Integer empId = 5;
        String empName = "AAA";
        // 2.执行第一次修改
        empDao.updateEmpName(empId, empName);
        // 3.准备第二次修改所需的数据
        empId = 6;
        empName = "BBB";
        // 4.执行第二次修改
        empDao.updateEmpName(empId, empName);
​
    }

eg:
@Transactional注解的位置:

①@Transactional注解写在类上之后相当于给类中的每一个方法都加了这个注解。包括注解中设置的属性,也会一起被作用到类中的方法。(如果类上@Transactional注解设置的属性,对具体的某个方法来说不合适,那么就可以在具体的这个方法上再声明一个@Transactional注解,设置自己需要的属性。此处遵循就近原则,离方法近的设置会覆盖离得远的设置。)
②@Transactional注解写在方法上,事务仅作用于这一个方法。

标签:empId,事务,empName,4.0,spring,jar,RELEASE,声明
来源: https://blog.csdn.net/qq_42263473/article/details/112251931