事务管理
事务分为声明式和编程式两种:
声明式事务:
声明式事务是指通过 注解的形式 或 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.jarjunit_4.12.jarmysql-connector-java-5.1.37-bin.jarorg.hamcrest.core_1.3.0.jarspring-aop-5.2.5.RELEASE.jarspring-aspects-5.2.5.RELEASE.jarspring-beans-5.2.5.RELEASE.jarspring-context-5.2.5.RELEASE.jarspring-core-5.2.5.RELEASE.jarspring-expression-5.2.5.RELEASE.jarspring-jcl-5.2.5.RELEASE.jarspring-jdbc-5.2.5.RELEASE.jarspring-orm-5.2.5.RELEASE.jarspring-test-5.2.5.RELEASE.jarspring-tx-5.2.5.RELEASE.jar
@Repositorypublic class UserDao { @Autowired JdbcTemplate jdbcTemplate; public void updateUser(){ // 演示的主要内容是事务 jdbcTemplate.update("update user set `username` = 'user用户表被修改了'"); }}@Repositorypublic class BookDao { @Autowired JdbcTemplate jdbcTemplate; public void updateBook(){ jdbcTemplate.update("update book set `name` = 'book图书表被修改了'"); }}@Servicepublic class TransactionService { @Autowired private BookDao bookDao; @Autowired private UserDao userDao; public void multiUpdate(){ bookDao.updateBook(); userDao.updateUser(); }}
3、测试Service的默认事务
测试service服务层的默认事务
@Servicepublic 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配置文件:
5.noRollbackFor和noRollbackForClassName测试不回滚的异常
Spring的事务管理默认是对抛出的RunTimeException 运行时异常. 以及它的子异常进行自动的回滚操作.
noRollbackFor和noRollbackForClassName测试不回滚的异常
@Transactional(noRollbackForClassName = "java.lang.ArithmeticException")public void multiUpdate() throws Exception { bookDao.updateBook(); int i = 12 / 0; userDao.updateUser();}