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

目录

一、事务管理方案

1. 修改业务层代码

2. 测试

二、事务管理器

1. 简介

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

3. 进行事务配置

三、事务控制的API

1. PlatformTransactionManager接口

2. TransactionDefinition接口

3. TransactionStatus接口

往期专栏&文章相关导读 

1. Maven系列专栏文章

2. Mybatis系列专栏文章

3. Spring系列专栏文章 

 


一、事务管理方案

        声明式事务底层采用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 {@Autowiredprivate AccountDao accountDao;@Autowiredprivate 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文件新增配置

    <!-- 事务管理器 --><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean><!-- 进行事务相关配置 --><tx:advice id = "txAdvice"><tx:attributes><!-- 代表所有方法 --><tx:method name="*" /></tx:attributes></tx:advice><!-- 配置切面 --><aop:config><!-- 配置切点 --><aop:pointcut id="pointcut" expression="execution(* com.example.service..*(..))"/><!-- 配置通知 --><aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"/></aop:config>

三、事务控制的API

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

1. PlatformTransactionManager接口

PlatformTransactionManager是Spring提供的事务管理器接口,所有事务管理器都实现了该接口。该接口中提供了三个事务操作方法:

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

2. TransactionDefinition接口

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

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

3. TransactionStatus接口

TransactionStatus是事务的状态接口,它描述了某一时间点上事务的状态信息。它有如下方法:

  1. void flush()  刷新事务
  2. boolean hasSavepoint() 获取是否存在保存点
  3. boolean isCompleted() 获取事务是否完成
  4. boolean isNewTransaction() 获取是否是新事务
  5. boolean isRollbackOnly() 获取是否回滚
  6. void setRollbackOnly()  设置事务回滚

往期专栏&文章相关导读 

     大家如果对于本期内容有什么不了解的话也可以去看看往期的内容,下面列出了博主往期精心制作的Maven,Mybatis等专栏系列文章,走过路过不要错过哎!如果对您有所帮助的话就点点赞,收藏一下啪。其中Spring专栏有些正在更,所以无法查看,但是当博主全部更完之后就可以看啦。

1. Maven系列专栏文章

Maven系列专栏Maven工程开发
Maven聚合开发【实例详解---5555字】

2. Mybatis系列专栏文章

Mybatis系列专栏MyBatis入门配置
Mybatis入门案例【超详细】
MyBatis配置文件 —— 相关标签详解
Mybatis模糊查询——三种定义参数方法和聚合查询、主键回填
Mybatis动态SQL查询 --(附实战案例--8888个字--88质量分)
Mybatis分页查询——四种传参方式
Mybatis一级缓存和二级缓存(带测试方法)
Mybatis分解式查询
Mybatis关联查询【附实战案例】
MyBatis注解开发---实现增删查改和动态SQL
MyBatis注解开发---实现自定义映射关系和关联查询

3. Spring系列专栏文章 

Spring系列专栏Spring IOC 入门简介【自定义容器实例】
IOC使用Spring实现附实例详解
Spring IOC之对象的创建方式、策略及销毁时机和生命周期且获取方式
Spring DI简介及依赖注入方式和依赖注入类型
Spring IOC相关注解运用——上篇
Spring IOC相关注解运用——下篇
Spring AOP简介及相关案例
注解、原生Spring、SchemaBased三种方式实现AOP【附详细案例】
Spring事务简介及相关案例
Spring 事务管理方案和事务管理器及事务控制的API
Spring 事务的相关配置、传播行为、隔离级别及注解配置声明式事务

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/1532.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot 中的 @EnableConfigurationProperties 注解

Spring Boot 中的 EnableConfigurationProperties 注解 在 Spring Boot 中&#xff0c;EnableConfigurationProperties 注解是一个非常有用的注解&#xff0c;它可以用于启用对特定配置类的支持。在本文中&#xff0c;我们将深入探讨 EnableConfigurationProperties 注解&…

2023年最新整理网络安全护网蓝队面试题​

如何打击黑灰产工具 全面监控和快速响应&#xff08;溯源&#xff09;&#xff1a;对黑灰进行长期跟进&#xff0c;了解黑灰产工具的传播链条和路径&#xff0c;第一时间捕获活跃的黑灰产工具&#xff08;建立特征词监控&#xff0c;数据取样、交叉分析&#xff09; 建立软件指…

ReentrantReadWriteLock源码

介绍 用一个变量如何维护多种状态 在 ReentrantLock 中&#xff0c;使用 Sync ( 实际是 AQS )的 int 类型的 state 来表示同步状态&#xff0c;表示锁被一个线程重复获取的次数。 但是&#xff0c;读写锁 ReentrantReadWriteLock 内部维护着一对读写锁&#xff0c;如果要用一…

windows下VScode搭建IDApython脚本开发环境遇到的问题

开发环境 IDA pro 7.7 vscode 最新版 python版本 与IDA 自带python 一致 3.8.10 (小版本号也必须要一致) 安装插件 下载 插件仓库的地址&#xff1a;https://github.com/ioncodes/idacode release版本 将插件安装到 IDApath/plugins/ idacode ->setting.py 设置如下:…

SpringMVC原理分析 | Hello程序

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; SpringMVC Spring MVC 是 Spring 提供的一个基于 MVC 设计模式的轻量级 Web 开发框架&#xff0c;本质上相当于 Servlet&#xff1b; 拥有结构最清晰的 ServletJSPJav…

一步一步学OAK之二: RGB相机控制

今天我们来实现 RGB相机的控制程序&#xff0c;用来控制彩色相机的曝光、灵敏度、白平衡、亮度/色度降噪、 设备端裁剪、相机触发器等。 目录 Setup 1: 创建文件Setup 2: 安装依赖Setup 3: 导入需要的包Setup 4: 全局变量Setup 5: 定义clamp函数Setup 6: 创建pipelineSetup 7:…

蜣螂优化算法(DBO)优化VMD参数,最小包络熵、样本熵、信息熵、排列熵(适应度函数可自行选择,一键修改)包含MATLAB源代码

蜣螂优化算法是华大学沈波教授团队&#xff0c;继麻雀搜索算法(Sparrow Search Algorithm&#xff0c;SSA&#xff09;之后&#xff0c;于2022年11月27日又提出的一种全新的群体智能优化算法。已有很多学者将算法用于实际工程问题中&#xff0c;今天咱们用蜣螂优化算法优化一下…

ASEMI代理光宝光耦LTV-6341的应用与性能分析

编辑-Z 本文将全面深入地探讨光耦LTV-6341的应用与性能。首先&#xff0c;我们将介绍光耦LTV-6341的基本概念和工作原理&#xff0c;然后&#xff0c;我们将详细分析其在电子设备中的应用&#xff0c;接着&#xff0c;我们将对其性能进行深入的分析&#xff0c;最后&#xff0…

python spider 爬虫 之 解析 xpath 、jsonpath、BeautifulSoup (二)

Jsonpath 安装&#xff1a; pip install -i https://pypi.tuna.tsinghua.edu.cn/simple jsonpath 使用&#xff1a;jsonpath 只能解析本地文件&#xff0c;跟xpath不一样 objjson.load(open(‘json文件’&#xff0c;‘r’, encoding‘utf-8’)) json.load(是文件&#xff0c;…

Flink-窗口源码

滚动窗口底层只有一个窗口&#xff0c;每次用for循环&#xff0c;把前面过期的数据移除&#xff0c;留下的数据再进行计算 滑动窗口的时间窗口&#xff0c;是有多个window的&#xff0c;因为有重叠的数据 计数窗口、计数滑动窗口&#xff0c;底层只有一个窗口 会话窗口只有一…

会声会影2023最新六大新功能,会声会影2023序列号能用多少次

会声会影2023版是一款非常实用的视频剪辑软件&#xff0c;该软件能够为广大用户带来丰富的集成化工具&#xff0c;并且优化了工作流程&#xff0c;无论你是新手还是老手都可以快速上手这款软件。会声会影2022永久激活版支持自定义码率设置&#xff0c;用户可以根据自己的需求设…

Linux--进入一个路径:cd

Linux系统中&#xff0c;磁盘上的文件和目录被组成一棵目录树&#xff0c;每个节点都是目录或文件 cd是change directory的简写 语法&#xff1a; cd 目录名 功能&#xff1a; 改变工作目录。将当前工作目录改变到指定的目录下。 举例&#xff1a; cd .. : 返回上级目录&…