您现在的位置是:首页 >技术交流 >Spring的第十四阶段:Spring的事务管理(01)网站首页技术交流

Spring的第十四阶段:Spring的事务管理(01)

DKPT 2024-06-17 10:19:00
简介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();
}
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。