Spring中事务管理方案和事务管理器及事务控制的API详解

 更新时间:2023年08月09日 09:15:27   作者:会洗碗的CV工程师  
这篇文章主要介绍了Spring中事务管理方案和事务管理器及事务控制的API详解,事务管理是指对事务进行管理和控制,以确保事务的正确性和完整性,事务管理的作用是保证数据库的数据操作的一致性和可靠性,需要的朋友可以参考下

一、事务管理方案

声明式事务底层采用AOP技术,在service层手动添加事务

1. 修改业务层代码

添加一个SqlSessionTemplate对象,让我们对业务方法进行try catch,没有异常则进行提交,捕捉到异常回滚即可。

package com.example.service;
import com.example.dao.AccountDao;
import com.example.pojo.Account;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
@Service
public class AccountService {
    @Autowired
    private AccountDao accountDao;
    @Autowired
    private SqlSessionTemplate sessionTemplate;
    /**
     *
     * @param id1 转出人id
     * @param id2 转入人id
     * @param price 金额
     */
    // 作用方法上时,该方法都将具有该类型事务的事务属性
    public void transfer(int id1,int id2, double price){
        try {
            // 转出人减少余额
            Account account1 = accountDao.findById(id1);
            account1.setBalance(account1.getBalance() - price);
            accountDao.update(account1);
            // 模拟程序出错
            int i = 1 / 0;
            // 转入人增加余额
            Account account2 = accountDao.findById(id2);
            account2.setBalance(account2.getBalance() + price);
            accountDao.update(account2);
            sessionTemplate.commit();
        }
        catch (Exception e){
            e.printStackTrace();
            sessionTemplate.rollback();
        }
    }
}

2. 测试

OK,可以看到这里程序是出现异常中断了的。现在观看数据库里面的情况是怎么样的。

OK,可以看到这里张三确实没有被扣钱啊,所以手动提交事务也是可以的,但是这样我们的try catch就太多了。因此有了事务管理器。

二、事务管理器

1. 简介

Spring依赖事务管理器进行事务管理,事务管理器即一个通知类,我们为该通知类设置切点为service层方法即可完成事务自动管理。

由于不同技术操作数据库,进行事务操作的方法不同。

如:JDBC提交事务是 connection.commit() ,MyBatis提交事务是 sqlSession.commit() ,所以Spring提供了多个事务管理器。

事务管理器名称作用
org.springframework.jdbc.datasource.DataSourceTransactionManager针对JDBC技术提供的事务管理器。适用于JDBC和MyBatis。
org.springframework.orm.hibernate3.HibernateTransactionManager针对于Hibernate框架提供的事务管理器。适用于Hibernate框架。
org.springframework.orm.jpa.JpaTransactionManager针对于JPA技术提供的事务管理器。适用于JPA技术。
org.springframework.transaction.jta.JtaTransactionManager跨越了多个事务管理源。适用在两个或者是多个不同的数据源中实现事务控制。

我们使用MyBatis操作数据库,接下来使用 DataSourceTransactionManager 进行事务管理。

2. 在配置文件中引入约束

xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
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

3. 进行事务配置

在applicationContext.xml文件新增配置

三、事务控制的API

事务管理器都实现了PlatformTransactionManager接口,Spring进行事务控制的功能是由三个接口提供的,这三个接口是Spring实现的,在开发中我们很少使用到,只需要了解他们的作用即可:

1.PlatformTransactionManager接口

PlatformTransactionManager是Spring提供的事务管理器接口,所有事务管理器都实现了该接口。

该接口中提供了三个事务操作方法:

  • TransactionStatus getTransaction(TransactionDefinition definition):获取事务状态信息。
  • void commit(TransactionStatus status):事务提交
  • void rollback(TransactionStatus status):事务回滚

2.TransactionDefinition接口

TransactionDefinition是事务的定义信息对象,它有如下方法:

  • String getName():获取事务对象名称
  • 。int getIsolationLevel():获取事务的隔离级别。
  • int getPropagationBehavior():获取事务的传播行为。
  • int getTimeout():获取事务的超时时间。
  • boolean isReadOnly():获取事务是否只读。

3.TransactionStatus接口

TransactionStatus是事务的状态接口,它描述了某一时间点上事务的状态信息。

它有如下方法:

  • void flush()  刷新事务
  • boolean hasSavepoint() 获取是否存在保存点
  • boolean isCompleted() 获取事务是否完成
  • boolean isNewTransaction() 获取是否是新事务
  • boolean isRollbackOnly() 获取是否回滚
  • void setRollbackOnly()  设置事务回滚

到此这篇关于Spring中事务管理方案和事务管理器及事务控制的API详解的文章就介绍到这了,更多相关Spring事务API内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MyBatis批量插入/修改/删除MySql数据

    MyBatis批量插入/修改/删除MySql数据

    这篇文章主要给大家介绍了关于MyBatis批量插入/修改/删除MySql数据的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • springboot jasypt2.x与jasypt3.x的使用方式

    springboot jasypt2.x与jasypt3.x的使用方式

    在软件开发中,将配置文件中的敏感信息(如数据库密码)进行加密是保障安全的有效手段,jasypt框架提供了这一功能,支持通过加密工具类或命令行工具生成密文,并通过修改配置文件和启动参数的方式使用密文和密钥,这样即便配置文件被泄露
    2024-09-09
  • java常用数据流应用实例解析

    java常用数据流应用实例解析

    这篇文章主要介绍了java常用数据流应用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • IDEA如何修改项目的JDK版本

    IDEA如何修改项目的JDK版本

    文章讲述了如何在IDEA中修改项目的JDK版本以解决Maven构建HibernateDemo时遇到的版本问题,Hibernate 5需要JDK 1.8,下载并安装JDK 1.8后,无需配置环境变量,而是通过IDEA的项目结构设置来更换项目JDK版本
    2024-12-12
  • OpenFeign设置header的三种方式总结

    OpenFeign设置header的三种方式总结

    在微服务间使用Feign进行远程调用时需要在header中添加信息,下面这篇文章主要给大家介绍了关于OpenFeign设置header的三种方式,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-04-04
  • Java ArrayAdapter用法案例详解

    Java ArrayAdapter用法案例详解

    这篇文章主要介绍了Java ArrayAdapter用法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • 基于Javamail实现发送邮件(QQ/网易邮件服务器)

    基于Javamail实现发送邮件(QQ/网易邮件服务器)

    这篇文章主要介绍了基于Javamail实现发送邮件,分别使用QQ邮箱作为smtp邮件服务器发送邮件,使用网易邮箱作为smtp邮件服务器发送邮件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • Java 获取网站图片的示例代码

    Java 获取网站图片的示例代码

    本文主要介绍了Java 获取网站图片的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • SpringBoot 整合 Shiro 密码登录与邮件验证码登录功能(多 Realm 认证)

    SpringBoot 整合 Shiro 密码登录与邮件验证码登录功能(多 Realm 认证)

    这篇文章主要介绍了SpringBoot 整合 Shiro 密码登录与邮件验证码登录(多 Realm 认证),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • Java接口异步调用

    Java接口异步调用

    这篇文章主要介绍了Java接口异步调用,下面我们来一起学习一下吧
    2019-05-05

最新评论