【Spring】Spring的事务管理
前言:
package com.aqiuo.service.impl;import com.aqiuo.dao.AccountMapper;
import com.aqiuo.pojo.Account;
import com.aqiuo.service.AccountService;
import org.springframework.jdbc.core.JdbcTemplate;import java.sql.Connection;
import java.sql.SQLException;/*** 账户的业务层实现类,实现新增的两条数据**/
public class AccountServiceImpl implements AccountService {AccountMapper accountMapper;JdbcTemplate jdbcTemplate;public void setAccountMapper(AccountMapper accountMapper) {this.accountMapper = accountMapper;}public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}public boolean pay(Integer money, Integer produce, Integer customer) throws SQLException {Connection connection=jdbcTemplate.getDataSource().getConnection();connection.setAutoCommit(false);try {accountMapper.addMoney(money, produce);accountMapper.subMoney(money, customer);connection.commit();}catch (Exception e){connection.rollback();e.printStackTrace();}finally {connection.close();}return false;}
}


Spring事务管理概述
事务管理的核心接口
- PlatformTransactionManager
- 该接口是Spring提供平台事务管理器,主要用于管理事务状态事务
- TransactionStatus getTransaction(TransactionDefinition definition):获取事务的状态信息
- void commit(TransactionStatus status):用于提交事务
- void rollback(TransactionStatus status):用于回滚事务
- 该接口并不了解具体实现类,常用如下
- org.springframework.jdbc.datasource.DateSourceTransactionManager:用于配置JDBC数据源的事务管理器
- org.springframework.orm.hibenate4.HibernateTransactionManager:用于配置Hibernate的事务管理器
- org.springframework.transaction.jta.JtaTransactionManager:用于配置全局事务管理器
- 该接口是Spring提供平台事务管理器,主要用于管理事务状态事务
- TransactionDefinition
- 该接口是事务定义的对象,该对象定义了事物的规则,并提供了获取事务相关信息的方法,如下::
- String getName()
- int getIsolationLevel():获取事务的隔离级别
- int getPropagationBehavior():获取事务的传播行为
- int getTimeout():获取事务的超时时间
- boolean isReadOnly(): 获取事务是否只读
- 事务的传播行为是指在同一个方法中,不同操作前后所用的事务。种类如下:
- 该接口是事务定义的对象,该对象定义了事物的规则,并提供了获取事务相关信息的方法,如下::
(用的一个DataSource)
| 属性名称 | 值 | 事务管理员 | 事务协调员 |
| PROPAGATION_REQUIRED | REQUIRED | 开启T 无 | 加入T 新建T |
| PROPAGATION_SUPPORTS | SUPPORTS | 开启T 无 | 加入T 无 |
| PROPAGATION_MANDATORY | MANDATORY | 开启T 无 | 加入T ERROR |
| PROPAGATION_REQUIRES_NEW | REQUIRES_NEW | 开启T 无 | 新建T2 新建T2 |
| PROPAGATION_NOT_SUPPORTED | NOT_SUPPORTED | 开启T 无 | 无 无 |
| PROPAGATION_NEVER | NEVER | 开启T 无 | ERROR 无 |
| PROPAGATION_NESTED | NESTED |
事务管理过程中,传播行为可以控制是否需要创建以及如何创建事务。
- TransactionStatus
- 该接口是事物的状态,描述了某一时间点上事物的状态信息
- void flush()
- boolean hasSavepoint()
- boolean isCompleted()
- boolean isNewTransaction()
- boolean isRollbackOnly()
- void setRollbackOnly()
- 该接口是事物的状态,描述了某一时间点上事物的状态信息
声明式事务管理
基于XML方式的声明式事务
Spring2.0以后,提供了tx命名空间来配置事务。tx命名空间下提供了元素来配置事务的通知。
当使用元素配置事务增强后,可以编写AOP配置,让Spring自动对目标生成代理

元素的属性
| name | 该属性为必选属性,指定了与事务属性相关的方法名,其属性支持通配符,例如:'get* ' |
| propagation | 用于指定事务的传播行为,默认值是REQUIRED |
| isolation | 用于指定事务的隔离级别,默认为DEFAULT |
| read-only | 用于指定事务是否只读,默认为false |
| timeout | 用于指定事务超时的时间,默认为-1,即永不超时 |
| rollback-for | 用于指定触发事务回滚的异常类 |
| no-rollback-for | 用于指定不触发事务回滚的异常类 |
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd " > <!-- 配置数据源 --><bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><!-- 数据库驱动 --><property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property><!-- 数据库的连接路径 --><property name="url" value="jdbc:mysql://localhost:3306/spring"></property><!-- 连接数据库的用户名 --><property name="username" value="root"></property><!-- 连接数据库的密码 --><property name="password" value="3.14159265358"></property></bean><!-- 配置jdbcTemplate --><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" ><property name="dataSource" ref="dataSource"></property></bean><!-- 注入 --><bean id="accountDao" class="com.aqiuo.jdbc.AccountDaoImpl"><property name="jdbcTemplate" ref="jdbcTemplate"></property></bean><!-- 事务管理器,依赖于数据源 --><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="*" propagation="REQUIRED" isolation="DEFAULT" read-only="false"></tx:method></tx:attributes></tx:advice><!-- 编写AOP,让Spring自动对目标生成代理,需要AspectJ的表达式 --><aop:config><aop:pointcut expression="execution(* com.aqiuo.*.*.*(..))" id="txPointCut"></aop:pointcut><!-- 切面,将切入点与通知整合 --><aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"></aop:advisor></aop:config></beans>
基于Annotation方式的声明式事务
Spring的声明式事务管理通过注解非常简单
步骤:
- 在Spring容器中注册事务注解驱动,代码如下
<tx:annotation-driver transaction-manager="transactionManager" />
- 在需要使用事务的SpringBean类(对类中所有方法有效)或Bean类上的方法(对该方法有效)上添加注解@Transactional
@Transactional可配置的参数
| value | 用于指定事务管理器 |
| transactionManager | 指定事务的限定符值,同value |
| isolation | 指定事务的隔离级别 |
| noRollbackFor | 指定遇到特定异常时强制不会滚事务 |
| noRollBackForClassName | 指定遇到特定的多个异常时强制不会滚事务,属性值可以指定多个异常类名 |
| propagation | 用于指定事务的传播行为 |
| read-only | 用于指定事务是否只读 |
| rollback-For | 指定遇到特定异常时强制回滚事务 |
| rollbackForClassName | 指定遇到特定的多个异常时强制回滚事务,属性值可以指定多个异常类名 |
| time | 指定事务的超时时长 |
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd " > <!-- 配置数据源 --><bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><!-- 数据库驱动 --><property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property><!-- 数据库的连接路径 --><property name="url" value="jdbc:mysql://localhost:3306/spring"></property><!-- 连接数据库的用户名 --><property name="username" value="root"></property><!-- 连接数据库的密码 --><property name="password" value="3.14159265358"></property></bean><!-- 配置jdbcTemplate --><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" ><property name="dataSource" ref="dataSource"></property></bean><!-- 注入 --><bean id="accountDao" class="com.aqiuo.jdbc.anno.AccountDaoImpl"><property name="jdbcTemplate" ref="jdbcTemplate"></property></bean><!-- 事务管理器,依赖于数据源 --><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property></bean><tx:annotation-driven transaction-manager="transactionManager" /></beans>
注意:
- 在实际开发中。事务的配置信息通常是在Spring的配置文件中完成的,而在业务层上只需要使用@Transactional注解即可。
- 不需要配置@Transactional注解的属性
总结:
1.配置文件方式:
<tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><tx:method name="find*" isolation="DEFAULT"/><tx:method name="pay" isolation="DEFAULT"></tx:method></tx:attributes>
</tx:advice><aop:config><aop:advisor advice-ref="txAdvice" pointcut="execution(public * com.aqiuo.service.impl.AccountServiceImpl.*(..))"></aop:advisor>
</aop:config>
2.配置文件+注解:
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
3.纯注解方式:
@EnableTransactionManager @Transactional
相关文章:
【Spring】Spring的事务管理
前言: package com.aqiuo.service.impl;import com.aqiuo.dao.AccountMapper; import com.aqiuo.pojo.Account; import com.aqiuo.service.AccountService; import org.springframework.jdbc.core.JdbcTemplate;import java.sql.Connection; import java.sql.SQLEx…...
配置cendos 安装docker 配置阿里云国内加速
由于我安装的cendos是镜像版。已经被配置好了。所以只需要更新相关配置信息即可。 输入 yum update自动更新所有配置 更新完成后输入 yum list docker-ce --showduplicates | sort -r 自动查询所有可用的docker版本 输入 yum install docker-ce docker-ce-cli container…...
【深度学习:Domain Adversarial Neural Networks (DANN) 】领域对抗神经网络简介
【深度学习:Domain Adversarial Neural Networks】领域对抗神经网络简介 前言领域对抗神经网络DANN 模型架构DANN 训练流程DANN示例 GPT示例 前言 领域适应(DA)指的是当不同数据集的输入分布发生变化(这种变化通常被称为共变量变…...
STM32 ESP8266 物联网智能温室大棚 (附源码 PCB 原理图 设计文档)
资料下载: https://download.csdn.net/download/vvoennvv/88680924 一、概述 本系统以STM32F103C8T6单片机为主控芯片,采用相关传感器构建系统硬件电路。其中使用DHT11温湿度传感器对温度和湿度的采集,MQ-7一氧化碳传感器检测CO浓度,GP2Y101…...
【DevOps-08-1】Harbor镜像仓库介绍和安装
一、简要描述 Harbor介绍Harbor安装 下载离线安装包把下载的离线安装包上传到服务器,并且解压修改Harbor配置文件启动Harbor登录Harbor管理后台Harbor管理后台首页二、Harbor介绍 前面在部署项目时,我们主要采用Jenkins推送jar包到指定服务器,再通过脚本命令让目标服务器对当…...
第八节 vue3新特性
系列文章目录 目录 系列文章目录 前言 操作方法 总结 前言 vue3与vue2的区别及特性。 具体信息 页面不用跟标签包裹cs...
Web前端-jQuery
文章目录 jQuery1.1 jQuery 介绍1.1.1 JavaScript 库1.1.2 jQuery的概念1.1.3 jQuery的优点 1.2 jQuery 的基本使用1.2.1 jQuery 的下载1.2.2 jQuery快速入门1.2.3 jQuery入口函数1.2.4 jQuery中的顶级对象$1.2.5 jQuery 对象和 DOM 对象1.2.6. jQuery 对象和 DOM 对象转换 1.3…...
Leetcod面试经典150题刷题记录 —— 二叉搜索树篇
Leetcod面试经典150题刷题记录-系列Leetcod面试经典150题刷题记录——数组 / 字符串篇Leetcod面试经典150题刷题记录 —— 双指针篇Leetcod面试经典150题刷题记录 —— 矩阵篇Leetcod面试经典150题刷题记录 —— 滑动窗口篇Leetcod面试经典150题刷题记录 —— 哈希表篇Leetcod面…...
【大数据进阶第三阶段之ClickHouse学习笔记】ClickHouse的简介和使用
1、ClickHouse简介 ClickHouse是一种列式数据库管理系统(DBMS),专门用于高性能数据分析和数据仓库应用。它是一个开源的数据库系统,最初由俄罗斯搜索引擎公司Yandex开发,用于满足大规模数据分析和报告的需求。 开源地址…...
Linux下Redis6下载、安装和配置教程-2024年1月5日
Linux下Redis6下载、安装和配置教程-2024年1月5日 一、下载二、安装三、启动四、设置开机自启五、Redis的客户端1.Redis命令行客户端2.windows上的图形化桌面客户端 一、下载 1.Redis的官方下载:https://redis.io/download/ 2.网盘下载: 链接ÿ…...
Java后端开发——Ajax、jQuery和JSON
Java后端开发——Ajax、jQuery和JSON 概述 Ajax全称是Asynchronous Javascript and XML,即异步的JavaScript和 XML。Ajax是一种Web应用技术,该技术是在JavaScript、DOM、服务器配合下,实现浏览器向服务器发送异步请求。 Ajax异步请求方式不…...
ssm基于Vue的戏剧推广网站论文
摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统戏剧推广信息管理难度大,容错率低,…...
安卓adb
目录 如何开启 ADB 注意事项 如何使用 ADB ADB 能干什么 ADB(Android Debug Bridge)是一个多功能命令工具,它可以允许你与 Android 设备进行通信。它提供了多种设备权限,包括安装和调试应用,以及访问设备上未通过…...
【数位dp】【动态规划】C++算法:233.数字 1 的个数
作者推荐 【动态规划】C算法312 戳气球 本文涉及的基础知识点 动态规划 数位dp LeetCode:233数字 1 的个数 给定一个整数 n,计算所有小于等于 n 的非负整数中数字 1 出现的个数。 示例 1: 输入:n 13 输出:6 示例 2ÿ…...
docker (portainer 安装nginx)
汉化版步骤可以参考:写文章-CSDN创作中心https://mp.csdn.net/mp_blog/creation/editor/135258056 一、创建容器 二、配置端口,以及容器卷挂载 挂载目录配置:(下方截图的目录如下,docker 改为 mydocker,用docker作为根…...
10个linux文件管理命令
1. ls – 列出目录内容 ls可能是每个Linux用户在其终端中键入的第一个命令。它允许您列出您想要的目录的内容(默认情况下是当前目录),包括文件和其他嵌套目录。 它有很多选择,所以最好使用 --help 来获得一些帮助。此标志返回所…...
实战:使用docker容器化服务与文件挂载-2
接着上文,演示Elasticsearch 和 Kibana 的安装,并讲解文件挂载 Elasticsearch of Docker (Kibana) 1、Elasticsearch 安装 ElasticSearch 使用 Docker 安装:https://www.yuque.com/zhangshuaiyin/guli-mall/dwrp5b 1.…...
联合union
//————联合:union 1.联合的定义 联合也是一种特殊的自定义类型 #include<stdio.h> union Un//Un为联合标签 { int a; char c; }; struct St { int a; int b; }; int main() { union Un u; printf("%d\n",sizeof(u));//…...
如何在 Umi /Umi 4.0 中配置自动删除 console.log 语句?
背景,开发时需要console.log 日志,再生产、uat 、sit不想看到日志打印信息 方案1、代码规范eslint校验"no-console": true, //console.log 方案2、bable 插件 babel-plugin-transform-remove-console 配置在.umirx.ts/js中 export default…...
(生物信息学)R语言绘图初-中-高级——3-10分文章必备——饼图(初级)
生物信息学文章的发表要求除了思路和热点以外,图片绘制是否精美也是十分重要的,本专栏为(生物信息学)R语言绘图初-中-高级——3-10分文章必备,主要通过大量文献,总结3-10分文章中高频出现的各种图片,并给大家提供图片复现的R语言代码,及图片识读。 本专栏将向大家介绍…...
【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...
Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...
android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...
零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...
