SpringBoot声明式事务

目录

  • 事务的基本特征
  • 隔离级别
  • 传播行为
  • @Transcation

事务的基本特征(ACID)

Atomic(原子性)

  事务中包含的操作被看作一个整体的业务单元,这个业务单元中的操作要么全部成功,要么全部失败,不会出现部分失败和部分成功的场景

Consistency(一致性)

  事务在完成时,必须使所有的数据都保持一直状态,在数据库中所有的修改都基于事务,保证了数据的完整性

Isolation(隔离性)

  多个应用程序线程同时访问统一数据,这样数据库同样的数据就会在各个不同的事务中被访问,这样会产生丢失更新,为了压制丢失更新的产生,数据库定义了隔离级别的概念,通过它的选择,可以在不同程度上压制丢失更新的产生。因为互联网的应用常常面对高并发的场景,所以隔离性是需要掌握的重点内容

Durability(持久性)

  事务结束后,所有的数据都会固化到一个地方,如保存磁盘当中,即时断电重启后也可以提供应用程序访问


  为了压制丢失更新,数据库提出了隔离级别,在不同程度上压制更新

  也许会有一个疑问,都全部消除丢失更新不就好了吗,为什么只是在不同的程度.上压制丢失更新呢?

  其实这个问题是从两个角度去看的,一个是数据的一致性,另一个是性能。数据库现有的技术完全可以避免丢失更新,但是这样做的代价,就是付出锁的代价,在互联网中,系统不单单要考虑数据的-致性,还要考虑系统的性能。试想,在互联网中使用过多的锁,--旦出现商品抢购这样的场景,必然会导致大量的线程被挂起和恢复,因为使用了锁之后,一个时刻只能有一个线程访问数据,这样整个系统就会十分缓慢,当系统被数千甚至数万用户同时访问时,过多的锁就会引发宕机,大部分用户线程被挂起,等待持有锁事务的完成,这样用户体验就会十分糟糕。因为用户等待的时间会十分漫长,一般而言,互联网系统响应超过5秒,就会让用户觉得很不友好,进而引发用户忠诚度下降的问题。所以选择隔离级别的时候,既需要考虑数据的一致性避免脏数据,又要考虑系统性能的问题。因此数据库的规范就提出了4种隔离级别来在不同的程度上压制丢失更新。

隔离级别

未提交读

  最低的隔离级别,含义是允许一个事务读取另外一个事务没有提交的数据。未提交读是一种危险的隔离级别,实际开发中应用不广

  • 优点:并发能力高。适合那些对数据一致性没有要求而追求高并发的场景
  • 缺点:出现脏读

读写提交

  指一个事务只能读取一个事务已经提交的数据,不能读取未提交的数据

  • 优点:克服脏读
  • 缺点:出现不可重复读

可重复读

  可重复读的目标是克服读写提交中出现的不可重复读的现象,因为在读写提交的时候,可能出现一些值的变化,影响当前事务的执行

  • 优点:克服不可重复读
  • 缺点:出现幻读

串行化

  数据库最高的隔离级别,它会要求所有的SQL都会按照顺序执行,这样就可以克服上诉隔离级别出现的各种问题,所以它能完全保证数据的一致性


  追求更高的隔离级别,它能更好地保证数据的一致性,但是也要付出锁的代价。有了锁,就意味着性能的丢失,而且隔离级别越高,性能越是直线下降。

  所以在选择隔离级别时,要考虑的不单单是数据一致性问题,还要考虑系统的性能问题

  一般而言,选择隔离级别会以读写提交为主,它能防止脏读,而不能避免不可重复读和幻读,为了克服数据不一致性和性能问题,程序开发者还设计了乐观锁,甚至不再使用数据库而使用其他手段

  对于隔离级别,不同的数据库支持也是不一样的

  • Oracle只支持读写提交和串行化,默认隔离级别为读写提交
  • MySQL能支持4种,默认隔离级别为可重复读

传播行为

  在Spring中,当一个方法调用另外一个方法,可以让事务采取不同的策略工作,如新建事务或挂起当前事务

     

  在一个批量任务执行的过程中,调用多个交易时,如果有一些交易发生异常,只是回滚出现异常的交易,而不是里整个批量任务,这样就能够是的那些没有问题的交易可以吮吸完成,而有问题的交易则不做任何事情


@Transcation

  对于声明式事务,使用@Transaction进行标注,可标注在类活着方法上,当它标注在类上时,代表这个类所有公共(public)非静态的方法都将启用事务功能

  默认配置下 Spring 只会回滚运行时、未检查异常(继承自 RuntimeException 的异常)或者 Error。

  • 捕获RuntimeException
  • 捕获Error
  • 并不捕获Checked Exception

有了@Transcation,Spring就会知道从哪启动事务,约定流程:

当上下文开始调用被@Transcation标注的类或者方法时,Spring就会产生AOP的功能。请注意事务的底层需要启动AOP功能,这就是Spring事务的底层实现

如有一个保存用户的方法,加入 @Transactional 注解,使用默认配置,抛出异常之后,事务会自动回滚,数据不会插入到数据库。

@RestController
public class HouseController {@Autowiredprivate HouseRepository houseRepository;@GetMapping("/test1")public String test1(){houseRepository.save(new House("house1", "100平方米"));houseRepository.save(new House("house2", "100平方米"));houseRepository.save(new House("house3", "100平方米"));houseRepository.save(new House("house444444444", "100平方米"));houseRepository.save(new House("house5", "100平方米"));return "success";}@GetMapping("/test2")@Transactionalpublic String test2(){houseRepository.save(new House("house6", "100平方米"));houseRepository.save(new House("house7", "100平方米"));houseRepository.save(new House("house8", "100平方米"));houseRepository.save(new House("house999999999", "100平方米"));houseRepository.save(new House("house10", "100平方米"));return "success";}
}

test1方法没有加入事务,test2方法加入了事务注解。

  test1:当输入http://localhost:8888/test1

  

数据库中插入了三条数据

因为第四条数据太长,所以插入失败,导致第五条正常数据插入失败,这并不是我们想要的,要么全成功,要么全失败

  test2:输入http://localhost:8888/test2

数据库中数据不变依然是三条数据,插入失败,所以全部回滚


本文借鉴:《深入浅出Spring Boot 2.x》书中有更详细的例子

返回顶部

转载于:https://www.cnblogs.com/echola/p/10999052.html

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

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

相关文章

团队作业——项目Alpha版本发布

---恢复内容开始--- https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass1 https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass1/homework/3329 <作业要求的链接> Gorious Computer <写上团队名称> 发布项目α版本&#xff0c;对项目…

MySQL异步复制

准备&#xff1a;主备库版本一致&#xff0c;正常安装软件。 1、主库上设置一个复制使用的账户&#xff1a; mysql> grant replication slave on *.* to rep1192.168.100.136 identified by dbking; Query OK, 0 rows affected (0.18 sec) mysql> select user,host,passw…

开源一个爬取redmine数据的测试报告系统

背景 软件测试的最后有一道比较繁琐的工作&#xff0c;就是编写测试报告。手写测试报告在数据统计和分析上面要耗费比较大的事件和精力。之前工作室使用mantis管理bug缺陷。公司有内部有个系统&#xff0c;可以直接从mantis上面获取数据并进行统计&#xff0c;生成一份测试报告…

使用.net Stopwatch class 来分析你的代码

当我们在调试&#xff0c;优化我们的代码的时候&#xff0c;想知道某段代码的真正的执行时间&#xff0c;或者我们怀疑某段代码&#xff0c;或是某几段代码执行比较慢&#xff0c; 需要得到具体的某段代码的具体执行时间的时候。有一个很好用的类Stopwatch。 Stopwatch 类在 Sy…

java衍生作用_java-如何从AffineTransform衍生的形状对象中“...

您可以使用AffineTransform.transform(Point2D, Point2D)变换多边形上的单个点.如果您不使用旋转变换来移动船,而是将船的位置保持在一个(x,y)位置,那么事情就简单得多.您可以在move()中移动飞船的位置,而不是尝试平移多边形.然后,当您想给船上油漆时,例如做&#xff1a;// Opt…

进程间通信 (IPC) 方法总结(三)

进程间通信 &#xff08;IPC&#xff09; 方法总结&#xff08;三&#xff09; 信号量&#xff08;SEMAPHORE&#xff09; 信号量是一个计数器&#xff0c;用于多进程对共享数据的访问&#xff0c;信号量的意图在于进程间同步。 为了获得共享资源&#xff0c;进程需要执行下列操…

实现离线加域---Windows2008 R2 新功能系列之八

我们都知道&#xff0c;部署活动目录&#xff0c;无非搭建一台或多台DC&#xff0c;然后把其它的客户端计算机或成员服务器全部加入域&#xff0c;但在windows2008SP2以前&#xff0c;客户端加入域时&#xff0c;DC必须在线&#xff0c;而从2008R2开始我们已经可以做到让客户端…

分表后需要注意的二三事

前言 本篇是上一篇《一次分表踩坑实践的探讨》&#xff0c;所以还没看过的朋友建议先看上文。 还是先来简单回顾下上次提到了哪些内容&#xff1a; 分表策略&#xff1a;哈希、时间归档等。分表字段的选择。数据迁移方案。而本篇文章的背景是在我们上线这段时间遇到的一些问题并…

DNS 原理

阮老师的作品&#xff0c;非常精彩&#xff0c;转载&#xff01; DNS 是互联网核心协议之一。不管是上网浏览&#xff0c;还是编程开发&#xff0c;都需要了解一点它的知识。 本文详细介绍DNS的原理&#xff0c;以及如何运用工具软件观察它的运作。我的目标是&#xff0c;读完此…

销售员/学员/讲师系统

前言: 今晚写一篇关于学员/讲师/销售员CRM系统。这个小项目是27号开始做的&#xff0c;大概搞了一星期不到。我把一些知识点总结下&#xff0c;还写下当时克服的BUG。 Django练习小项目&#xff1a;学员管理系统设计开发 带着项目需求学习是最有趣和效率最高的&#xff0c;今天…

java里面的 |运算符_Java 中 | ^ 运算符的简单使用

背景今天碰到了代码中的按位与运算&#xff0c;复习一下&#xff0c;先列一个各个进制数据表。顺便复习一下十进制转二进制的计算方式&#xff1a;接下来解释下这三个运算符&#xff1a;&  按位与&#xff0c;都转为二进制的情况下&#xff0c;同为1则为1&#xff0c;否则…

彻底理解正向代理、反向代理、透明代理

套用古龙武侠小说套路来说&#xff0c;代理服务技术是一门很古老的技术&#xff0c;是在互联网早期出现就使用的技术。一般实现代理技术的方式就是在服务器上安装代理服务软件&#xff0c;让其成为一个代理服务器&#xff0c;从而实现代理技术。常用的代理技术分为正向代理、反…

使用showMessageDialog显示消息框

-----------------siwuxie095 工程名&#xff1a;TestJOptionPane 包名&#xff1a;com.siwuxie095.showdialog 类名&#xff1a;TestMessageDialog.java 工程结构目录如下&#xff1a; 代码&#xff1a; package com.siwuxie095.showdialog; import java.awt.BorderLayout;…

NodeJS学习笔记(一)——搭建开发框架Express,实现Web网站登录验证

目录 开发环境  1、建立工程  2、目录结构  3、Express配置文件  4、Ejs模板  5、安装常用库及页面分离  6、路由  7、session  8、页面访问控制及提示JS是脚本语言&#xff0c;脚本语言都需要一个解析器才能运行。对于写在HTML页面里 的JS&#xff0c;浏览器充…

项目经理如何管理情绪?这三本书管理书籍你必须要看

本文主要是介绍三本管理的书籍&#xff0c;需要全部书籍的可以加Q群375508415去拿走。里面很多大神的PMP资料。 大家有没有觉得项目经理有时像个政委&#xff0c;做员工思想工作&#xff1b; 有时像个HR&#xff0c;操心员工的稳定和发展&#xff1b; 有时像个咨询顾问&#xf…

[RN] React Native 自定义导航栏随滚动渐变

React Native 自定义导航栏随滚动渐变 实现效果预览&#xff1a; 代码实现&#xff1a; 1、定义导航栏 NavPage.js import React, {Component} from react; import {View, Text, Image, StyleSheet, TouchableOpacity, Platform, Dimensions} from react-native;/*** 自定义导航…

【CSS 技能提升】 :before和:after的使用

前几天的晚上较全面的去看了下css的一些文档和资料&#xff0c;大部分的样式运用都没什么大问题了&#xff0c;只是有些许较陌生&#xff0c;但是也知道他们的存在和实现的是什么样式。今天主要想在这篇学习笔记中写的也不多&#xff0c;主要是针对:before和:after写一些内容&a…

成功试验基于C#/.NET的Android开发

今天最开心事情莫过于摸索验证了一个事情&#xff0c;C#也能进行Android和IOS开发&#xff0c;白天安装了开发环境&#xff0c;晚上进行测试&#xff0c;直到此时此刻&#xff0c;已经成功的导出一款基于C#/.NET的安卓APK&#xff0c;并且能够成功的导入到安卓手机运行&#xf…

深入理解了MySQL,你才能说熟悉数据库

先抛出几个问题 1.为什么不建议使用订单号作为主键?2.为什么要在需要排序的字段上加索引?3.for update 的记录不存在会导致锁住全表?4.redolog 和 binlog 有什么区别?5.MySQL 如何回滚一条 sql ?6.char(50) 和 varchar(50) 效果是一样的么?索引知识回顾 对于 MySQL 数据库…

网站QQ全屏PHP代码,QQ技术导航升级版 超级导航美化版带后台版 PHP源码

QQ技术导航升级版 超级导航美化版带后台版改进F2样式&#xff0c;主针对QQ教程网、卡盟、博客、提供更好收录的位置。改进QQ技术导航背景&#xff0c;增加整体美观效果。去掉死链页面&#xff0c;站长操作使用更加有扩大空间。优化后台登陆界面&#xff0c;去掉织梦后台携带的广…