https://blog.csdn.net/yalishadaa/article/details/70261973

当同一个应用程序或者不同应用程序中的多个事务在同一个数据集上并发执行时,可能会出现许多意外的问题

并发事务所导致的问题可以分为下面三种类型:

脏读: 对于两个事物T1,T2, T1  读取了已经被T2更新但还没有被提交的字段. 之后,若T2回滚,T1读取的内容就是临时且无效的.

不可重复读:对于两个事物T1,T2, T1  读取了一个字段,然后T2更新了该字段.之后,T1再次读取同一个字段, 值就不同了.

幻读:对于两个事物T1,T2, T1  从一个表中读取了一个字段,然后T2在该表中插入了一些新的行.之后,如果T1再次读取同一个表,就会多出几行.

从理论上来说, 事务应该彼此完全隔离,以避免并发事务所导致的问题.然而,那样会对性能产生极大的影响,因为事务必须按顺序运行.

在实际开发中, 为了提升性能,事务会以较低的隔离级别运行.

事务的隔离级别可以通过隔离事务属性指定

事务的隔离级别要得到底层数据库引擎的支持,而不是应用程序或者框架的支持.

Oracle支持的2种事务隔离级别:READ_COMMITED, SERIALIZABLE

Mysql支持4中事务隔离级别.

事务的回滚通过@Transactional 注解完成。
1.设置事务的隔离级别:

可以在 @Transactional的isolation属性中设置隔离级别.

2.设置事务的回滚属性

默认情况下只有未检查异常(RuntimeException和Error类型的异常)会导致事务回滚.而受检查异常不会.

事务的回滚规则可以通过@Transactional注解的rollbackFor和noRollbackFor属性来定义.
ex:

[java] view plain copy

  1. @Transactional(propagation = Propagation.REQUIRES_NEW,isolation = Isolation.READ_COMMITTED,
  2. noRollbackFor = {UserAccountException.class},
  3. )

[java] view plain copy

  1. UserAccountException

造成的异常都会被忽略。

[java] view plain copy

  1. rollbackFor:  遇到时必须进行回滚
  2. noRollbackFor: 一组异常类,遇到时必须不回滚

3.设置超时属性

超时事务属性: 事务在强制回滚之前可以保持多久.这样可以防止长期运行的事务占用资源.

ex:

[java] view plain copy

  1. @Transactional(propagation = Propagation.REQUIRES_NEW,isolation = Isolation.READ_COMMITTED,
  2. noRollbackFor = {UserAccountException.class},
  3. timeout = 3)

如果在函数中有任务执行时间大于3秒,就算没有异常抛出也会强制回滚。

4.设置只读事务属性

表示这个事务只读取数据但不更新数据,这样可以帮助数据库引擎优化事务.

ex:

[java] view plain copy

  1. @Transactional(propagation = Propagation.REQUIRES_NEW,isolation = Isolation.READ_COMMITTED,
  2. noRollbackFor = {UserAccountException.class},
  3. readOnly = false,timeout = 1)

@Transactiona注解的使用相关推荐

  1. SSM4==通过XML配置spring 事务,通过纯注解配置spring 事务

    mysql的事务管理,是指在有关系的表(比如有外键)之间实现ACID,比如表A的金额列的外键是表B的金额列,那么如果A的金额减了300,B的金额也要减少300.如果A减300成功了,B失败了,mysq ...

  2. 一天十道Java面试题----第四天(线程池复用的原理------>spring事务的实现方式原理以及隔离级别)

    这里是参考B站上的大佬做的面试题笔记.大家也可以去看视频讲解!!! 文章目录 31.线程池复用的原理 32.spring是什么? 33.对Aop的理解 34.对IOC的理解 35.BeanFactor ...

  3. 2022 Java 知识点总结

    2022 Java知识点总结 Java Code 类加载 类加载机制 双亲委派机制 类的初始化 反射 反射的实现方式和原理 获取反射中的 Class 对象 获取构造函数 获取属性 获取方法 获取Cla ...

  4. spring实战学习(六)事务管理

    什么是事务? 在软件领域,我们将一组要么全部执行要么全不执行的操作叫做事物. 事务的四个特性(ACID) 原子性(atomicity):原子性确保了事物中的操作像原子操作一样要就全部执行或全不执行,如 ...

  5. Lock wait timeout exceeded; try restarting transaction解决

    前言 服务报错: Lock wait timeout exceeded; try restarting transaction 排查 字面意思 锁等待超时了,尝试重启事务. 既然是数据库死锁,着手排查 ...

  6. 2022年整理最详细的java面试题、掌握这一套八股文、面试基础不成问题[吐血整理、纯手撸]

    这里是参考B站上的大佬做的面试题笔记.大家也可以去看视频讲解!!! 文章目录 1.面向对象 2.JDK.JRE.JVM区别和联系 3.==和equals 4.final 5.String .Strin ...

  7. JAVA_SpringBoot中涉及的注解

    SpringBoot注解 动吧 new 对象是一个耗时的过程, spring 是一个资源整合框架. @SpringBootApplication 由此注解(@SpringBootApplication ...

  8. 在kotlin companion object中读取spring boot配置文件,静态类使用@Value注解配置

    在kotlin companion object中读取配置文件 静态类使用@Value注解配置 class Config {@Value("\${name}")fun setNam ...

  9. 使用feign调用注解在eureka上的微服务,简单学会微服务

    使用feign调用注解在eureka上的微服务. 首先,确保所有服务(调用方与被调用方)都被注册在同一个eureka服务上. 1. 在调用方添加依赖(万事第一步,加依赖) <dependency ...

最新文章

  1. Effective java 43返回零长度的数组或者集合而不是null
  2. R语言ggplot2可视化:可视化离散(分类)变量的堆叠的柱状图、横轴是离散变量、柱状图是多个分组的计数和叠加
  3. 大数据基础设施建设需要得到重视 | 记清华大数据“应用·创新”讲座
  4. DataGrid中,读取数据库中的图片并绑定数据列或磁盘目录中的图片,用输出流方式...
  5. “throw”和“throw ex”之间有区别吗?
  6. Spring Boot 2.4版本前后的分组配置变化及对多环境配置结构的影响
  7. 【转】HTML5第一人称射击游戏发布
  8. CSDN博客文章阅读模式插件(附源码)
  9. async await 同步方法调用异步方法死锁
  10. python使用zip迭代列表
  11. 论文阅读:BASNet:Boundary-Aware Salient Object Detection
  12. [链表|多解法] leetcode 19 删除链表的倒数第N个节点
  13. AE MG动画脚本motion2 脚本使用方法学习笔记
  14. 标签打印软件如何制作医疗废物标签
  15. VScode 删除远程资源管理器中SSH TARGETS
  16. 多线程为什么比单线程快呢?
  17. android查看摄像头信息,获取Android设备上的详细的摄像头信息
  18. daytime协议的服务器和客户端程序,用Socket套接字实现DAYTIME协议的服务器和客户端程序-20210414073352.docx-原创力文档...
  19. flash迷宫游戏教程
  20. 在 markdown 中使用表情符号

热门文章

  1. P3150 pb的游戏(1)
  2. 怎样做一个卓越的程序员
  3. Windows mobile 下读取手机SIM卡信息
  4. HDU2066 一个人的旅行【最短路径+Floyd算法】
  5. CCF201812-1 小明上学(100分)【序列处理】
  6. JSK-58 合法回文【字符串】
  7. NUC1422 字母旋转游戏【水题】
  8. C/C++ 工具函数 —— 大端模式和小端模式的互换
  9. 【智力题】—— 猴子分桃
  10. 强悍的 linux —— sed 与 awk