声明式事务
作者:互联网
声明式事务
事务的控制交给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