首页 > 编程语言 >Java中@Transactional 注解使用注意事项

Java中@Transactional 注解使用注意事项

时间:2023-06-13 18:13:44浏览次数:45  
标签:事务 Java 隔离 幻读 Transactional 脏读 注解 级别 读取

隔离级别 关键词

原子性(Atomicity):

  事务是数据库的逻辑工作单位,它对数据库的修改要么全部执行,要么全部不执行。

一致性(Consistemcy):

  事务前后,数据库的状态都满足所有的完整性约束。

隔离性(Isolation):

  并发执行的事务是隔离的,一个不影响一个。如果有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,
必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。通过设置数据库的隔离级别,可以达到不同的隔离效果。 持久性(Durability):   在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

隔离级别 解释

更新丢失:

  两个事务都同时更新一行数据,但是第二个事务却中途失败退出,导致对数据的两个修改都失效了。这是因为系统没有执行任何的锁操作,因此并发事务并没有被隔离开来。

脏读:

  脏读又称无效数据读出。一个事务读取另外一个事务还没有提交的数据叫脏读。

  例如:事务T1修改了一行数据,但是还没有提交,这时候事务T2读取了被事务T1修改后的数据,之后事务T1因为某种原因Rollback了,那么事务T2读取的数据就是脏的。

不可重复读:

  不可重复读是指在同一个事务内,两个相同的查询返回了不同的结果。

  例如:事务T1读取某一数据,事务T2读取并修改了该数据,T1为了对读取值进行检验而再次读取该数据,便得到了不同的结果。

幻读:

  事务在操作过程中进行两次查询,第二次查询的结果包含了第一次查询中未出现的数据或者缺少了第一次查询中出现的数据

  例如:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样。这就叫幻读

isolation的参数有以下五种:

  • Isolation.DEFAULT:为数据源的默认隔离级别
  • isolation=Isolation.READ_UNCOMMITTED:未授权读取级别
    •   以操作同一行数据为前提,读事务允许其他读事务和写事务,未提交的写事务禁止其他写事务(但允许其他读事务)。此隔离级别可以防止更新丢失,但不能防止脏读、不可重复读、幻读。此隔离级别可以通过“排他写锁”实现。
  • iIsolation.READ_COMMITTED:授权读取级别
    •   以操作同一行数据为前提,读事务允许其他读事务和写事务,未提交的写事务禁止其他读事务和写事务。此隔离级别可以防止更新丢失、脏读,但不能防止不可重复读、幻读。此隔离级别可以通过“瞬间共享读锁”和“排他写锁”实现。
  • iIsolation.REPEATABLE_READ:可重复读取级别
    •   以操作同一行数据为前提,读事务禁止其他写事务(但允许其他读事务),未提交的写事务禁止其他读事务和写事务。此隔离级别可以防止更新丢失、脏读、不可重复读,但不能防止幻读。此隔离级别可以通过“共享读锁”和“排他写锁”实现。
  • iIsolation.SERIALIZABLE:序列化级别
    •   提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,不能并发执行。此隔离级别可以防止更新丢失、脏读、不可重复读、幻读。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。

隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed。它能够避免更新丢失、脏读,而且具有较好的并发性能。尽管它会导致不可重复读、幻读这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。

所有注解的参数

 

标签:事务,Java,隔离,幻读,Transactional,脏读,注解,级别,读取
From: https://www.cnblogs.com/cgy-home/p/17478380.html

相关文章

  • 分享一个Java功能小案例(代码已开源哦)
    工程合集工程列表地址预览B站抖音......
  • Java流程控制——the next day
    用户交互ScannerNext和NextLineJava5的新特性,带来了java.util.Scanner类,提供了人机交互的作用。我们可以通过它获取用户的输入。 publicclassDemo2{   publicstaticvoidmain(String[]args){     Scanners=newScanner(System.in);//创建一个扫描器对......
  • java 学习路线
    基础: java高级 https://www.bilibili.com/video/BV17F411T7Ao/?spm_id_from=333.337.search-card.all.click https://www.bilibili.com/video/BV1yW4y1Y7Ms/?spm_id_from=333.788.recommend_more_video.0 mysql高级https://www.bilibili.com/video/BV1Kr4y1i7ru/?spm_id_from=33......
  • JavaCV音视频开发宝典:使用JavaCV读取海康平台或海康网络摄像头sdk回调视频TS码流并解
    《JavaCV音视频开发宝典》专栏目录导航《JavaCV音视频开发宝典》专栏介绍和目录​前言两年前博主写了如何利用JavaCV解析各种h264裸流,《JavaCV音视频开发宝典:使用javacv读取GB28181、海康大华平台和网络摄像头sdk回调视频码流并解析预览图像》,但是随着时间变化,各个厂商sdk也......
  • java中 怎么把字符串转成 double
    Java中可以使用Double类中的静态方法 parseDouble() 将一个字符串转换为double类型的数值。用法如下:Stringstr="3.14";doublenumber=Double.parseDouble(str);在上述代码中,我们首先定义一个字符串 str,它包含了要转换的数值。然后,我们使用 parseDouble() 方法将字......
  • java中 怎么把字符串转成 double
    Java中可以使用Double类中的静态方法 parseDouble() 将一个字符串转换为double类型的数值。用法如下:Stringstr="3.14";doublenumber=Double.parseDouble(str);在上述代码中,我们首先定义一个字符串 str,它包含了要转换的数值。然后,我们使用 parseDouble() 方法将字......
  • java ImageIO处理图像的封装
    评:packagecom.adam.dev.pic.easyImage;importjava.awt.AlphaComposite;importjava.awt.Color;importjava.awt.Font;importjava.awt.Graphics;importjava.awt.Graphics2D;importjava.awt.Point;importjava.awt.Rectangle;importjava.awt.co......
  • java 代理(静态代理、动态代理的不同实现)详解及示例
    (文章目录)本文简单的介绍了java的代理概念,针对静态和动态代理的不同定义与实现方式,并给出了详细的示例,最后给出一个综合的应用,展示动态代理的使用。一、代理构成1、代理介绍代理模式上,基本上有Subject角色,RealSubject角色,Proxy角色。Subject角色负责定义RealSubject和Proxy......
  • java常见的排序算法(冒泡排序、选择排序、插入排序、shell排序、归并排序、堆排序、快
    (文章目录)本文简单的介绍了java常见的几种排序。所有的排序均是一个数组由小到大进行排序。一、冒泡排序1、效率表现和适用范围效率O(n²)适用于排序小列表2、算法实现publicvoidbubbleSortArray(int[]a){ intn=a.length; for(inti=1;i<n;i++){ fo......
  • springboot~代码风格统计spring-javaformat-maven-plugin插件
    SpringJavaformat是Spring团队开发的一款基于GoogleJavaFormat的代码格式化工具,可以帮助Java开发者自动化进行代码格式化,提高代码质量,降低代码维护成本。SpringJavaformat可以自定义配置文件,支持大量的代码风格配置选项,满足不同项目和团队的需求。还可以与Gradle、Maven、Int......