spring事务处理

spring事务

事务介绍

一个事务要么同时成功,要么同时失败

特性
  • Atomic原子性 事务是由一个或多个活动组成的一个工作单元。原子性确保事务中的所有操作全部发生或全部不发生

  • Consistent一致性 一旦事务完成,系统必须确保它所建模的业务处于一致的状态

  • Isolated隔离性 事务允许多个用户对数据进行操作,每个用户的操作不会与其他用户纠缠在一起,多个事务之间数据要相互隔离

  • Durable持久性 一旦事务完成,事务的结果应该持久化

事务隔离级别
  • DEFAULT 使用底层数据库预设的隔离层级
  • READ_UNCOMMITTED (读未提交的数据) 允许事务读取其他并行的事务还没提交的数据,脏读、不可重复读、幻读问题都存在
  • READ_COMMITTED(读已提交的数据) 只允许事务读取其他并行事务提交的数据,可以避免脏读,但是不可重复读和幻读仍存在
  • REPEATABLE_READ(可重复读) 确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其他事务对这个字段进行更新,可以避免脏读和不可重复读,但幻读仍存在(Mysql默认的事务隔离级别)
  • SERIALIZABLE(串行化) 确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其他事务对该表执行插入、更新和删除操作,所有并发问题都可以避免,但是性能低下

脏读: 一个未提交事务读取到另一个未提交事务的数据,读得数据已经被修改了,已经过时失去意义了

不可重复读: 一个未提交事务读取到另一个提交事务修改的数据,同一个事务里面多次读取同一行数据,却返回不同的结果

幻读:一个未提交事务读取到另一个提交事务添加的数据,同样一个查询在整个事务过程中多次执行后,查询所得的结果集不一样

传播行为
  • PROPAGATION_REQUIRED 支持当前事务,如果当前没有事务,就新建一个事务;如果有事务,就在这个事务内运行

  • PROPAGATION_SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行;如果有事务,就在这个事务内运行

  • PROPAGATION_MANDATORY 支持当前事务,如果当前没有事务,就抛出异常。配置该传播级别是有效的控制上下文调用代码遗漏添加事务控制的保证手段。

  • PROPAGATION_REQUIRED_NEW 新建事务,如果当前存在事务,把当前事务挂起

  • PROPAGATION_NOT_SUPPORTED 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。可以缩小事务

  • PROPAGATION_NEVER 以非事务方式执行操作,如果当前存在事务,则抛出异常

  • PROPAGATION_NESTED 如果当前存在事务,则在嵌套事务内执行,被嵌套的事务可从当前事务中单独地提交或回滚;如果当前没有事务,则新建事务

只读

事务只进行读取操作

readOnly=true 告诉spring当前事务只会进行读取操作,不会进行修改操作,可以帮助数据库引擎优化

注:如果设置为只读的话,千万不要在事务里修改数据,使用只读操作时,spring不会进行加锁处理,如果修改数据的话,会出现问题

事务超时

事务时间过长,则回滚,默认是-1

回滚规则

默认是发生运行时异常回滚

rollback-for 指事务对于哪些异常应当回滚而不提交(默认spring会对所有的运行时异常回滚)

no-rollback-for 指事务对于哪些异常继续执行不回滚

spring事务的使用

sprin的事务处理其实就是通过AOP来实现的,使用

create table user(
    id int primary key AUTO_INCREMENT,
    name varchar(20not null,
    account double 
 )ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
 insert into user (name,accountvalues('张三',1000);
 insert into user (name,accountvalues('李四',1000);
<!-- 事务 -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>4.3.29.RELEASE</version>
</dependency>

<!-- 事务管理器以及数据源 -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>4.3.29.RELEASE</version>
</dependency>

<!-- mysql驱动 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.48</version>
</dependency>
事务管理器

spring使用事务管理器来进行事务的管理,最底层的接口是PlatformTransactionManager,主要作用是为应用程序提供事务界定的统一方式,通过该接口,spring为各个平台都提供了对应的事务管理器

public interface PlatformTransactionManager {
 // 根据指定的传播行为,该方法返回当前活动事务或创建一个新的事务
  // TransactionDefinition是事务的定义信息,包括隔离级别、传播行为、超时、只读等设置
  // TransactionStatus事务的状态,包括是否为新事务、是否已提交、是否有保存点、是否回滚等
   TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
// 提交给定的事务和状态
   void commit(TransactionStatus status) throws TransactionException;
// 回滚给定事务
   void rollback(TransactionStatus status) throws TransactionException;

}

关键类TransactionAspectSupport

// 定义了事务属性
public interface TransactionDefinition {
 // 返回传播行为
 default int getPropagationBehavior() {
  return PROPAGATION_REQUIRED;
 }

 // 返回该事务独立于其他事务的工作的程度
 default int getIsolationLevel() {
  return ISOLATION_DEFAULT;
 }

 // 返回以秒为单位的时间间隔,事务必须在该时间间隔内完成
 default int getTimeout() {
  return TIMEOUT_DEFAULT;
 }

 // 该事务是否是只读的
 default boolean isReadOnly() {
  return false;
 }

 // 返回事务的名称
 @Nullable
 default String getName() {
  return null;
 }


 static TransactionDefinition withDefaults() {
  return StaticTransactionDefinition.INSTANCE;
 }

}

根据不同的持久化框架提供不同的实现类

  • 使用mybatis时,实现类为DataSourceTransactionManager
  • 使用Hibernate时,实现类为HibernateTransactionManager
  • 使用JPA时,实现类为JpaTransactionManager
使用注解

在这里采用的是spring中的数据源

<!-- 数据源 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  <property name="driverClassName" value="com.mysql.jdbc.Driver" />
  <property name="url" value="jdbc:mysql://localhost:3306/spring?useUnicode=true&amp;characterEncoding=utf-8" />
  <property name="username" value="root" />
  <property name="password" value="123456" />
</bean>

<!-- 事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource"/>
</bean>

<!-- 启用事务注解 -->
<tx:annotation-driven transaction-manager="transactionManager"/>

当然由于是使用的注解,不要忘记组件扫描

<context:component-scan base-package="com.zhanghe.study.spring4.beans.tx"/>

之后就可以在要保证事务的方法上配置@Transactional以及在该注解上配置相应的事务隔离级别(isolation)、事务传播行为(propagation)、对哪些异常执行回滚(rollbackFor)以及不执行回滚(noRollbackFor) 默认对运行时异常回滚

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Transactional {
  //指定使用的事务管理器
   @AliasFor("transactionManager")
   String value() default "";

   @AliasFor("value")
   String transactionManager() default "";

   // 设置事务传播行为
   Propagation propagation() default Propagation.REQUIRED;

   // 设置事务隔离级别
   Isolation isolation() default Isolation.DEFAULT;

   // 设置事务超时时间
   int timeout() default TransactionDefinition.TIMEOUT_DEFAULT;

   // 读写或只读事务,默认读写
   boolean readOnly() default false;

   // 导致事务回滚的异常类数组
   Class<? extends Throwable>[] rollbackFor() default {};

   // 导致事务回滚的异常类名字数组
   String[] rollbackForClassName() default {};

   // 不会导致事务回滚的异常类数组
   Class<? extends Throwable>[] noRollbackFor() default {};

   // 不会导致事务回滚的异常类名字数组
   String[] noRollbackForClassName() default {};
}
使用XML
<!-- 数据源 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  <property name="driverClassName" value="com.mysql.jdbc.Driver" />
  <property name="url" value="jdbc:mysql://localhost:3306/spring?useUnicode=true&amp;characterEncoding=utf-8" />
  <property name="username" value="root" />
  <property name="password" value="123456" />
</bean>

<!-- 事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource"/>
</bean>

<!-- 配置事务通知 使用xml配置事务属性 -->
<tx:advice id="txAdvice"  transaction-manager="transactionManager">
    <tx:attributes>
        <!-- 根据方法名指定特定的事务属性 -->
        <tx:method name="get*" read-only="true"/>
        <tx:method name="find*" read-only="true"/>
        <tx:method name="save*" propagation="REQUIRED"/>
    </tx:attributes>
</tx:advice>


<aop:config>
   <!-- 配置事务切入点 -->
    <aop:pointcut id="pointCut" expression="execution(* com.zhanghe.study.spring4.beans.tx.UserService.*(..))"/>
    <!-- 配置切面 把事务切入点和通知关联起来-->
    <aop:advisor advice-ref="txAdvice" pointcut-ref="pointCut"/>
</aop:config>

分布式事务

随着业务越来越庞大,有时候可能会采取分库分表的方式来进行处理,那么如果数据都不在一个数据库了,如何进行事务处理呢?那就用到了分布式事务,java的事务规范中提出了JTA来进行分布式事务的处理,而在spring中进行了JTA的实现,在springboot中可以使用spring-boot-starter-jta-atomikos来进行实现

https://zhhll.icu/2021/框架/spring/基础/8.Spring事务/

本文由 mdnice 多平台发布

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VirtualBox虚拟机使用win11系统,忘记密码如何重置密码

1. 点击重启同时按住Shift&#xff08;按住不放&#xff09; 2. 直到出现下面的界面&#xff0c;释放Shift&#xff0c;并进入疑难解答 3. 进入高级选项 4. 进入命令提示符 5. 发现当前是在X盘&#xff1f; 6. 进入C:\Windows\System32 c: cd Windows\System32 7. 备份osk.exe…

SpringCloud系列(5)--SpringCloud微服务工程公共部分提取

前言&#xff1a;在上一章节中我们创建了两个个SpringCloud工程&#xff0c;但在两个工程中分别存在着一些重复的部分&#xff0c;例如重复的实体类&#xff08;如图所示&#xff09;&#xff0c;这样会造成系统的冗余&#xff0c;所以我们需要把公共的类提取到一个工程里&…

预约小程序新选择:强大后端管理功能一览

拥有一个功能齐全、操作便捷的小程序对于商家来说至关重要。为了满足广大商家的需求&#xff0c;乔拓云平台提供了丰富的模板资源&#xff0c;帮助用户快速搭建预约型小程序&#xff0c;并配备了强大的后端管理功能&#xff0c;让商家能够轻松管理预约订单&#xff0c;提升运营…

Centos7 ElasticSearch集群搭建

1. 服务器环境配置 1.1 配置hosts文件 3台服务器都要执行 vim /etc/hosts; # 将以下内容写入3台服务器hosts文件 192.168.226.148 es001 192.168.226.149 es002 192.168.226.150 es003 1.2 关闭防火墙 3台服务器都要执行 systemctl stop firewalld; systemctl disable…

【opencv】dnn示例-speech_recognition.cpp 使用DNN模块结合音频信号处理技术实现的英文语音识别...

模型下载地址&#xff1a; https://drive.google.com/drive/folders/1wLtxyao4ItAg8tt4Sb63zt6qXzhcQoR6 终端输出&#xff1a;&#xff08;audio6.mp3 、audio10.mp3&#xff09; [ERROR:00.002] global cap_ffmpeg_impl.hpp:1112 open VIDEOIO/FFMPEG: unsupported parameter…

# 从浅入深 学习 SpringCloud 微服务架构(一)基础知识

从浅入深 学习 SpringCloud 微服务架构&#xff08;一&#xff09;基础知识 1、系统架构演变&#xff1a; 1&#xff09;单体应用架构。如电商项目。 用户管理、商品管理、订单管理&#xff0c;在一个模块里。 优点&#xff1a;开发简单&#xff0c;快速&#xff0c;适用于…

Mac下brew安装php7.4

这里作者挂了梯子&#xff0c;所以很流畅&#xff01; brew的下载&#xff0c;可参考另外一篇博文&#xff5e;Homebrew 安装与卸载 1、将第三方仓库加入brew brew tap shivammathur/php2、安装指定版本的PHP brew install php7.43、替换Mac自带PHP环境并刷新环境变量 -> …

基于simulink的模拟锁相环和数字锁相环建模与对比仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 模拟锁相环&#xff08;PLL&#xff09;的基本原理 4.2 数字锁相环&#xff08;DPLL&#xff09;的基本原理 5.完整工程文件 1.课题概述 模拟锁相环和数字锁相环建模的simulink建模&#xff0c;对…

OpenHarmony UI动画-recyclerview_animators

简介 带有添加删除动画效果以及整体动画效果的list组件库 下载安装 ohpm install ohos/recyclerview-animatorsOpenHarmony ohpm 环境配置等更多内容&#xff0c;请参考如何安装OpenHarmony ohpm 包 使用说明 引入组件库 import { RecyclerView } from "ohos/recycler…

Qt/C++音视频开发70-无感切换通道/无缝切换播放视频/多通道流畅切换/不同视频打开无缝切换

一、前言 之前就写过这个方案&#xff0c;当时做的是ffmpeg内核版本&#xff0c;由于ffmpeg内核解析都是代码实现&#xff0c;所以无缝切换非常完美&#xff0c;看不到丝毫的中间切换过程&#xff0c;看起来就像是在一个通道画面中。其实这种切换只能说是取巧办法&#xff0c;…

排序算法之计数排序

目录 一、简介二、代码实现三、应用场景 一、简介 算法平均时间复杂度最好时间复杂度最坏时间复杂度空间复杂度排序方式稳定性计数排序O(nk )O(nk)O(nk)O(k)Out-place稳定 稳定&#xff1a;如果A原本在B前面&#xff0c;而AB&#xff0c;排序之后A仍然在B的前面&#xff1b; 不…

稀碎从零算法笔记Day52-LeetCode:从双倍数组中还原原数组

题型&#xff1a;数组、贪心 链接&#xff1a;2007. 从双倍数组中还原原数组 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 一个整数数组 original 可以转变成一个 双倍 数组 changed &#xff0c;转变方式为将 original 中每个元素 值乘以 …

记录ubuntu20.04安装nvidia-525.85.05显卡驱动(学习笔记2024.4.15、4.16)

电脑&#xff1a;华硕天选X2024 显卡&#xff1a;4060Ti i5-14400F 架构&#xff1a;x86_64 我需要使用Linux系统使用IsaacSim进行仿真&#xff0c;所以安装的都是IsaacSim中的推荐版本。 一.对新鲜的电脑进行分盘 电脑刚到手&#xff0c;900多个G全在C盘里&#xff0c;给它…

学习笔记(4月18日)vector底层模拟实现(1)

1.迭代器 vector实际上是由迭代器进行维护的&#xff0c;关于迭代器是什么&#xff0c;为什么要叫这个名字&#xff0c;后面的学习会逐渐了解&#xff0c;现在先将迭代器是作为指针即可。 vector底层有三个迭代器&#xff0c;用来起到容量、数组头、元素个数的作用。 同时为…

数字零售力航母-看微软如何重塑媒体

数字零售力航母-看微软如何重塑媒体 - 从2024全美广播协会展会看微软如何整合营销媒体AI技术和AI平台公司 2024年&#xff0c;微软公司联合英伟达总司&#xff0c;赞助全美广播协会展会。本次展会微软通过搭建一个由全面的合作伙伴生态系统支持的可信和安全的平台&#xff0c;…

RIP最短路实验(华为)

思科设备参考&#xff1a;RIP最短路实验&#xff08;思科&#xff09; 一&#xff0c;技术简介 RIP&#xff08;Routing Information Protocol&#xff0c;路由信息协议&#xff09;是一种基于距离矢量的内部网关协议&#xff0c;工作原理是每个路由器周期性地向邻居路由器发…

【网站项目】新生报到系统小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

Spring Boot | Spring Boot “缓存管理“

目录: 一、Spring Boot 默认 "缓存" 管理 :1.1 基础环境搭建① 准备数据② 创建项目③ 编写 "数据库表" 对应的 "实体类"④ 编写 "操作数据库" 的 Repository接口文件⑤ 编写 "业务操作列" Service文件⑥ 编写 "applic…

Vue2进阶之Vue2高级用法

Vue2高级用法 mixin示例一示例二 plugin插件自定义指令vue-element-admin slot插槽filter过滤器 mixin 示例一 App.vue <template><div id"app"></div> </template><script> const mixin2{created(){console.log("mixin creat…

美团财务科技后端一面:如何保证数据一致性?延时双删第二次失败如何解决?

更多大厂面试内容可见 -> http://11come.cn 美团财务科技后端一面&#xff1a;项目内容拷打 美团财务科技后端一面&#xff1a;项目相关面试题&#xff0c;主要包含 Zset、延时双删失败重试、热点数据解决、ThreadLocal 这几个方面相关的内容 由于前几个问题是对个人项目的…
最新文章