您现在的位置是:首页 >技术交流 >Spring的第十四阶段:Spring的事务管理(01)网站首页技术交流
Spring的第十四阶段:Spring的事务管理(01)
简介Spring的第十四阶段:Spring的事务管理(01)
事务管理
事务分为声明式和编程式两种:
声明式事务:
声明式事务是指通过 注解的形式 或 xml配置的形式 对事务的各种特性进行控制和管理。
编码式(编程式)事务:
指的是通过编码的方式实现事务的声明。
1、编码方式实现事务:
2、声明式事务环境搭建
2.1、准备测试数据库
##创建tx数据库
drop database if exists `tx`;
CREATE database `tx`;
##切换tx数据库
USE `tx`;
##创建用户表
CREATE TABLE `user` (
`id` int primary key auto_increment,
`username` varchar(50) NOT NULL,
`money` int(11) DEFAULT NULL
);
##插入数据
insert into `user`(`username`,`money`) values ('张三',1000),('李四',1000);
##创建图书表
create table `book`(
`id` int primary key auto_increment,
`name` varchar(500) not null,
`stock` int
);
##插入数据
insert into book(`name`,`stock`) values('java编程思想',100),('C++编程思想',100);
##查看数据
select * from book;
select * from user;
2.2、创建一个Java工程,导入Jar包
导需要以下的jar包:
druid-1.1.9.jar
junit_4.12.jar
mysql-connector-java-5.1.37-bin.jar
org.hamcrest.core_1.3.0.jar
spring-aop-5.2.5.RELEASE.jar
spring-aspects-5.2.5.RELEASE.jar
spring-beans-5.2.5.RELEASE.jar
spring-context-5.2.5.RELEASE.jar
spring-core-5.2.5.RELEASE.jar
spring-expression-5.2.5.RELEASE.jar
spring-jcl-5.2.5.RELEASE.jar
spring-jdbc-5.2.5.RELEASE.jar
spring-orm-5.2.5.RELEASE.jar
spring-test-5.2.5.RELEASE.jar
spring-tx-5.2.5.RELEASE.jar
@Repository
public class UserDao {
@Autowired
JdbcTemplate jdbcTemplate;
public void updateUser(){
// 演示的主要内容是事务
jdbcTemplate.update("update user set `username` = 'user用户表被修改了'");
}
}
@Repository
public class BookDao {
@Autowired
JdbcTemplate jdbcTemplate;
public void updateBook(){
jdbcTemplate.update("update book set `name` = 'book图书表被修改了'");
}
}
@Service
public class TransactionService {
@Autowired
private BookDao bookDao;
@Autowired
private UserDao userDao;
public void multiUpdate(){
bookDao.updateBook();
userDao.updateUser();
}
}
3、测试Service的默认事务
测试service服务层的默认事务
@Service
public class TransactionService {
@Autowired
private BookDao bookDao;
@Autowired
private UserDao userDao;
public void multiUpdate(){
bookDao.updateBook();
int i = 12 / 0;
userDao.updateUser();
}
}
3.1、异常的演示
数据库中 图书表修改成功
用户表修改失败:
3.2、Spring事务引入的分析------PlatformTransactionManager类简单介绍
在Spring框架中,事务管理由一个接口 PlatformTransactionManager 来定义如何管理:
以下是PlatformTransactionManager实现类:
Spring底层事务管理原理解析:
4、使用Spring的注解声明事务管制
测试Spring的声明式事务
ApplicationContext.xml配置文件:
<!-- 配置切面类 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--
DataSourceTransactionManager中的数据源一定是操作数据库时使用的数据源
-->
<property name="dataSource" ref="dataSource"/>
</bean>
<!--
应用事务的代理
transaction-manager="transactionManager" 配置事务管理器
如果事务管理器的 id 值是 transactionManager 可以省略不配
注解 @Transactional 和 tx:annotation-driven标签组合使用.
-->
<tx:annotation-driven
transaction-manager="transactionManager" />
5.noRollbackFor和noRollbackForClassName测试不回滚的异常
Spring的事务管理默认是对抛出的RunTimeException 运行时异常. 以及它的子异常进行自动的回滚操作.
noRollbackFor和noRollbackForClassName测试不回滚的异常
/**
* @Transactional 表示使用通知( 启用事务 ) <br/>
*
* noRollbackFor 属性表示定义义哪些异常不在回滚事务 <br/>
* noRollbackForClassName 属性需要指定不回滚的异常的全类名 <br/>
*/
@Transactional(noRollbackForClassName = "java.lang.ArithmeticException")
public void multiUpdate() throws Exception {
bookDao.updateBook();
int i = 12 / 0;
userDao.updateUser();
}
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。