写在前面:
由于底层事务管理就是使用了AOP,所以说Spring声明式事务管理也分为XML实现和注解方式实现,在上一篇博客中为大家接收了XML方式(链接:http://blog.youkuaiyun.com/may_3/article/details/79402541),这篇博客,将完善一下Spring声明式事务管理的另一种方式。
注解方式的实现步骤:
(1)引入相关Jar文件
(2)在bean.xml中,配置事务管理器类,开启注解扫描,指定使用注解方式实现事务控制
(3)在需要添加事务控制的地方,加入@Transactional
@Transactional注解
(1)定义到方法上,当前方法应用Spring的声明式事务控制
(2)定义到类上,当前类的所有方法应用Spring的声明式事务控制
(3)定义到父类上,当执行父类的方法的时候,应用Spring的声明式事务控制
事务属性
@Transactional(
readOnly=false, //读写事务
timeout=-1,//事务的超时时间不限制
noRollbackFor=ArithmeticException.class,//遇到数学异常不会滚
//事务的传播行为,指定当前的方法必须在事务的环境下执行
//如果当前运行的方法,已经存在事务,就会加入当前的事务
propagation=Propagation.REQUIRED,
//如果当前运行的方法,已经存在事务,事务会挂起,会始终开启一个新的事务,执行完后,刚才挂起的事务才继续运行
propagation=Propagation.REQUIRES_NEW
isolation=Isolation.DEFAULT //事务的隔离级别,数据库的默认
//事务的传播行为
)
Spring声明式事务管理案例
这个程序实现的就是,在注解方式实现事务管理后,DeptService方法中的异常出现后,数据库已经添加的数据将会回滚。
Dept类代码:
package tx2;
public class Dept {
private int deptId;
private String deptName;
public int getDeptId() {
return deptId;
}
public void setDeptId(int deptId) {
this.deptId = deptId;
}
public String getDeptName() {
return deptName;
}
public void setDeptName(String deptName) {
this.deptName = deptName;
}
}
DeptDao类代码:
package tx2;
import javax.annotation.Resource;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
@Repository
public class DeptDao {
// 接收容器注入的JdbcTemplate对象
@Resource
private JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public void save(Dept dept) {
String sql1 = "insert into dept1 (deptname) values(?)";
jdbcTemplate.update(sql1, dept.getDeptName());
}
}
DeptService类代码实现:
package tx2;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class DeptService {
@Resource
private DeptDao deptDao;
/**
* 加入事务控制
* @param dept
*/
@Transactional
public void save(Dept dept) {
deptDao.save(dept);
// 异常位置,观察是否会混滚,且是否会继续提交
int i = 1 / 0;
deptDao.save(dept);
}
}
测试类APP代码:
package tx2;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class APP {
ApplicationContext ac = new ClassPathXmlApplicationContext("tx2/bean.xml");
@Test
public void testApp() {
Dept dept = new Dept();
dept.setDeptName("PHP开发");
DeptService deptService = (DeptService) ac.getBean("deptService");
deptService.save(dept);
}
}
bean.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
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/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- 数据源c3p0连接池对象 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/demo0228"></property>
<property name="user" value="root"></property>
<property name="password" value="admin123"></property>
<property name="initialPoolSize" value="3"></property>
<property name="maxPoolSize" value="3"></property>
<property name="maxStatements" value="100"></property>
<property name="acquireIncrement" value="2"></property>
</bean>
<!-- JdbcTemplate工具类对象 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 配置事务管理器类 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 开启注解扫描 -->
<context:component-scan base-package="tx2"></context:component-scan>
<!--指定注解方式实现事务控制 -->
<tx:annotation-driven transaction-manager="txManager"/>
</beans>
在Junit测试后,正常会报 java.lang.ArithmeticException: /by zero异常,而且此时,数据库中不会添加一条新的数据,这就证明了我们的事务处理成功。
本文介绍Spring框架中使用注解实现声明式事务管理的方法,包括配置步骤与关键代码示例,展示了如何通过@Transactional注解控制事务。
672

被折叠的 条评论
为什么被折叠?



