spring 笔记十 Spring事务管理

文章目录

    • 编程式事务控制相关对象
      • PlatformTransactionManager
    • TransactionDefinition
      • 事务隔离级别
      • 事务传播行为
    • TransactionStatus
    • 基于XML 的声明式事务控制
      • 什么是声明式事务控制
    • 声明式事务控制的实现
    • 切点方法的事务参数的配置
  • 基于注解的声明式事务控制
    • 使用注解配置声明式事务控制

编程式事务控制相关对象

PlatformTransactionManager

PlatformTransactionManager 接口是spring 的事务管理器,它里面提供了我们常用的操作事务的方法。

方法说明
TransactionStatus getTransaction(TransactionDefination defination)获取事务的状态信息
void commit(TransactionStatus status)提交事务
void rollback(TransactionStatus status)回滚事务

TransactionDefinition

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

方法说明
int getIsolationLevel()获得事务的隔离级别
int getPropogationBehavior()获得事务的传播行为
int getTimeout()获得超时时间
boolean isReadOnly()是否只读

事务隔离级别

设置隔离级别,可以解决事务并发产生的问题,如脏读、不可重复读和虚读。
 ISOLATION_DEFAULT
 ISOLATION_READ_UNCOMMITTED
 ISOLATION_READ_COMMITTED
 ISOLATION_REPEATABLE_READ
 ISOLATION_SERIALIZABLE

事务传播行为

 REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。一般的选择(默认值)
 SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行(没有事务)
 MANDATORY:使用当前的事务,如果当前没有事务,就抛出异常
 REQUERS_NEW:新建事务,如果当前在事务中,把当前事务挂起。
 NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起
 NEVER:以非事务方式运行,如果当前存在事务,抛出异常
 NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行REQUIRED 类似的操作
 超时时间:默认值是-1,没有超时限制。如果有,以秒为单位进行设置
 是否只读:建议查询时设置为只读

TransactionStatus

TransactionStatus 接口提供的是事务具体的运行状态,方法介绍如下。

方法说明
boolean hasSavepoint()是否存储回滚点
boolean isCompleted()事务是否完成
boolean isNewTransaction()是否是新事务
boolean isRollbackOnly()事务是否回滚

基于XML 的声明式事务控制

什么是声明式事务控制

Spring 的声明式事务顾名思义就是采用声明的方式来处理事务。这里所说的声明,就是指在配置文件中声明,用在Spring 配置文件中声明式的处理事务来代替代码式的处理事务。

声明式事务处理的作用
 事务管理不侵入开发的组件。具体来说,业务逻辑对象就不会意识到正在事务管理之中,事实上也应该如此,因为事务管理是属于系统层面的服务,而不是业务逻辑的一部分,如果想要改变事务管理策划的话,也只需要在定义文件中重新配置即可
 在不需要事务管理的时候,只要在设定文件上修改一下,即可移去事务管理服务,无需改变代码重新编译,这样维护起来极其方便

声明式事务控制的实现

声明式事务控制明确事项:
 谁是切点?
 谁是通知?
 配置切面?

① 引入tx命名空间

<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/tx 
http://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd">

②配置事务增强

<!--平台事务管理器--><bean id="transactionManager" 
class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property></bean><!--事务增强配置--><tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><tx:method name="*"/></tx:attributes></tx:advice>

③ 配置事务AOP 织入

<!--事务的aop增强--><aop:config><aop:pointcut id="myPointcut" expression="execution(* 
com.onenewcode.service.impl.*.*(..))"/></aop:config>

④ 测试事务控制转账业务代码

@Overridepublic void transfer(String outMan, String inMan, double money) {accountDao.out(outMan,money);int i = 1/0;accountDao.in(inMan,money);}

切点方法的事务参数的配置

<!--事务增强配置--><tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><tx:method name="*"/></tx:attributes></tx:advice>

其中,<tx:method> 代表切点方法的事务参数的配置,例如:
<tx:method name=“transfer” isolation=“REPEATABLE_READ” propagation=“REQUIRED” timeout=“-1” read-only=“false”/>

 name:切点方法名称
 isolation:事务的隔离级别
 propogation:事务的传播行为
 timeout:超时时间
 read-only:是否只读

基于注解的声明式事务控制

使用注解配置声明式事务控制

  1. 编写AccoutDao
 @Repository("accountDao")public class AccountDaoImpl implements AccountDao {@Autowiredprivate JdbcTemplate jdbcTemplate;public void out(String outMan, double money) {jdbcTemplate.update("update account set money=money-? where name=?",money,outMan);}public void in(String inMan, double money) {jdbcTemplate.update("update account set money=money+? where name=?",money,inMan);}}
  1. 编写AccoutService
 @Service("accountService")@Transactionalpublic class AccountServiceImpl implements AccountService {@Autowiredprivate AccountDao accountDao;@Transactional(isolation = Isolation.READ_COMMITTED,propagation = 
Propagation.REQUIRED)public void transfer(String outMan, String inMan, double money) {accountDao.out(outMan,money);int i = 1/0;accountDao.in(inMan,money);}}
  1. 编写applicationContext.xml 配置文件
<!--之前省略datsSource、jdbcTemplate、平台事务管理器的配置--><!--组件扫描--><context:component-scan base-package="com.onenewcode"/><!--事务的注解驱动--><tx:annotation-driven/>

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

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

相关文章

力扣LCR 130. 衣橱整理(DFS 解法)

Problem: LCR 130. 衣橱整理 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 首先该问题可以归纳为一类遍历二维矩阵的题目&#xff0c;此类中的一部分题目可以利用DFS来解决&#xff0c;具体到本题目&#xff1a; 我们可以利用一个布尔类型的二维数组记录我们已经访…

no module named ‘xxx‘

目录结构如下 我想在GCNmodel的model里引入layers的GraphConvolution&#xff1a;from GCNmodel.layers import GraphConvolution&#xff0c;但这样却报错no module named GCNmodel&#xff0c;而且用from layers import GraphConvolution也不行。然后用sys.path.appen(xxx)…

selenium-grid4.3.0两种模式记录

selenium-grid4.3.0两种模式记录 本文运行&#xff0c;需要提前配置好Java11以及安装好Chrom、Firefox、Safari其中一个浏览器&#xff0c;如果是Chrom、Firefox需要下载对应版本的驱动&#xff0c;并给 webdriver 配置环境变量&#xff0c;Safari浏览器Mac系统会自带&#xf…

使用下载代替物理串口输出-STM32 Debug (printf) Viewer

使用下载代替物理串口输出-STM32 Debug 硬件要求配置方法代码要求打印输出结果 硬件要求 STM32的PB9、PB10引脚的串口1通常用作其他功能使用后&#xff0c;无法通过printf()函数打印输出想要调试输出查看变量或调试信息。现已使用另外一种方法实现printf()函数打印输出。 ST…

百度搜索品牌形象优化怎么做?

搜索口碑现代网络营销不可或缺的一部分&#xff0c;特别是品牌搜索形象的优化是品牌方最为关注的重点之一。随着竞争的加剧&#xff0c;企业必须确保他们的产品或服务在搜索引擎结果中的排名尽可能地靠前&#xff0c;同时也必须保持自身品牌形象的丰满和调性。 企业如何做好品牌…

Mr. Cappuccino的第67杯咖啡——MacOS通过PD安装Win11

MacOS通过PD安装Win11 下载ParallelsDesktop安装ParallelsDesktop激活ParallelsDesktop下载Windows11安装Windows11激活Windows11 下载ParallelsDesktop ParallelsDesktop下载地址 安装ParallelsDesktop 关闭上面的窗口&#xff0c;继续操作 激活ParallelsDesktop 关闭上面的…

【LeetCode刷题】-- 161.相隔为1的编辑距离

161.相隔为1的编辑距离 方法&#xff1a;一次遍历 首先&#xff0c;我们要确认字符串的长度不会相差太远。如果长度差了2个或更多字符&#xff0c;那么 s 和 t 就不可能是一次编辑之差的字符串。 接下来&#xff0c;我们假设 s 的长度总是短于或等于 t 的长度。如果不是这样&…

SQL基础:SQL 介绍和数据库基础

SQL简介 常用的Java等语言是和计算机交流的工具&#xff0c;告诉计算机&#xff0c;让计算机做一些事。 和其类似&#xff0c;SQL是 Structured Query Language 的缩写&#xff0c;即结构化的查询语言&#xff0c;是和数据库交互的工具&#xff0c;即通过既定的一些格式&…

MySQL数据库存储

MySQL数据库存储 MySQL数据库简介MySQL开发环境MySQL安装图形化界面工具Navicat使用 表的操作表的概念3.2 创建表3.3 修改表 数据的操作-增删改查4.1 增加数据4.2 删除数据4.3 修改数据4.4 查询数据4.4.1 基础查询4.4.2 分组查询和聚合函数4.4.4 having语句4.4.5 排序4.5 多表联…

【MATLAB第82期】基于MATLAB的季节性差分自回归滑动平均模型SARIMA时间序列预测模型含预测未来

【MATLAB第82期】基于MATLAB的季节性差分自回归滑动平均模型SARIMA时间序列预测模型含预测未来 一、模型介绍 1、模型简介 季节性差分自回归移动平均模型&#xff08;Seasonal Autoregressive Integrated Moving Average Model, SARIMA&#xff09;&#xff0c;又称为周期性…

uniapp的uni-im 即时通信使用教程【用户与商家对话、聊天 / 最新 / 最全 / 带源码 / 教程】

目录 使用场景用户图片商家图片 官方文档官方文档地址插件地址 项目创建uniCloud开发环境申请开发环境申请完后 概括开始使用步骤1App.vue 步骤2找到软件登录图片找到软件登录接口登录源码如下 步骤3找到软件注册图片注册源码如下 步骤4找到index.vue首页图片 index.vue源码如下…

佛山IBM System x3550 M4服务器维修检查

案例背景&#xff1a; 一家位于东莞的制造公司&#xff0c;在其佛山分厂中安装了一台IBM X3550 M4服务器作为其关键业务设备。该服务器负责管理和存储公司的生产数据、ERP系统和供应链数据。在生产过程中&#xff0c;该服务器突然发生了故障&#xff0c;导致佛山分厂的生产中断…

LT7911D是TYPE-C/DP或者EDP转2 PORT MIPI和LVDS加音频

1.概述&#xff1a; T7911D是一款高性能TYPE-C/DP/EDP转2 PORT MIPI或者LVDS的芯片&#xff0c;目前主要在AR/VR或者显示器上应用的很多&#xff0c;对于DP1.2输入&#xff0c;LT7911D可配置为1/2/4车道。自适应均衡化使其适用于长电缆应用&#xff0c;最大带宽可达21.6Gbps。…

编译android的C版本Lua库

本文讲述如何使用android studio 编译最新版本的Lua开源库),请自行下载。 我们提供的Demo,可以自行下载,工程结构如下: 本文编译的是Lua 5.4.6的版本,编译采用cmake的方式,我们支持编译静态库和动态库(我们在这一讲里:“Lua与***C在Android上的互调”是使用静态库)…

管理类联考——数学——真题篇——按知识分类——几何——解析几何

文章目录 解析几何2023真题&#xff08;2023-07&#xff09;-几何-解析几何-最值-画图求最值-两线相减求最大-联想三角形的“两边差小于第三边”&#xff0c;当为第三边为最大真题&#xff08;2023-19&#xff09;-几何-解析几何-最值-画图求最值-圆方程画出圆的形状-两点间距离…

实现两张图片的接缝线拼接

使用ORB算法检测特征点&#xff0c;并通过BFMatcher进行特征点匹配。然后&#xff0c;根据Lowes ratio test选择好的匹配点&#xff0c;并使用findHomography计算单应性矩阵。最后&#xff0c;使用warpPerspective将图像进行透视变换&#xff0c;然后将第二张图像粘贴到变换后的…

如何在PHP中使用WebSocket进行实时通信?

在PHP中使用WebSocket进行实时通信涉及到创建WebSocket服务器和与客户端建立WebSocket连接。以下是一般的步骤&#xff1a; 选择WebSocket库&#xff1a; 首先&#xff0c;您需要选择一个合适的PHP WebSocket库。一些流行的WebSocket库包括 Ratchet、ReactPHP、PHP-Websockets …

自动驾驶学习笔记(十九)——Planning模块

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo 社区开发者圆桌会》免费报名—>传送门 文章目录 前言 Planning作用 Planning内容 Plannin…

Python 爬虫之简单的爬虫(一)

爬取网页上所有链接 文章目录 爬取网页上所有链接前言一、基本内容二、代码编写1.引入库2.测试网页3.请求网页4.解析网页并保存 三、如何定义请求头&#xff1f;总结 前言 最近也学了点爬虫的东西。今天就先给大家写一个简单的爬虫吧。循序渐进&#xff0c;慢慢来哈哈哈哈哈哈…

Linux 操作系统 006-操作系统的启动与关闭

Linux 操作系统 006-操作系统的启动与关闭 本节关键字&#xff1a;Linux、操作系统的启动与关闭、运行级别 本节相关指令&#xff1a;shutdown、reboot、sync、init、man、help 关机/重启 命令说明shutdown -h now立即进行关机shutdown -h 11分钟后关机shutdown -r now现在重…