首页 > 编程语言 >Java常见面试题之事务

Java常见面试题之事务

时间:2024-10-31 22:21:08浏览次数:6  
标签:面试题 Java 幻读 级别 事务 READ 注解 数据

博主介绍

上海交大毕业,大厂资深Java后端工程师
《Java全套学习资料》作者
专注于系统架构设计和高并发解决方案和面试辅导
阿里云开发社区乘风者计划专家博主
@author[vx] vip1024p(备注java)
在这里插入图片描述
在这里插入图片描述

ACID特性

  1. A:原子性,Atomictiy,事务是最小的执行单位,不允许分割,事务的原子性确保动作要么全部完成,要么完全不起作用.
  2. C:一致性 Consistency,执行事务前后,数据保持一致.
  3. I:隔离性Isolation 并发访问数据库时,一个用户的事务不背其他事务所干扰,个并发事务之间数据库相互独立.
  4. D:持久性 Durability 一个事务被提交之后,它对数据库中数据的改变是持久的,及时数据库发生故障也不应该对其有任何影响.

并发事务可能带来哪些问题

更新丢失: 当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,由于每个事务都不知道其他事务的存在,就会发生丢失更新问题,最后的更新覆盖了由其他事务所做的更新.

**脏读:**当一个事务正在访问数据并且对数据进行了修改,而这种修改还没提交到数据库中,这是另一个事务也访问了这个数据,然后使用了这个数据.因为这个数据是没有提交的,那么读到的这个数据就是’脏数据’

**不可重复读:**一个事务多次读同一个数据,在这个事务还没结束的时候,另一个事务也访问该数据.那么第一事务的两次读取数据之间,由于第二个事务的修改导致一个事务内两次读到的数据是不太一样的情况,因此称为不可重复读.

**幻读:**幻读与不可重复读类似,它发生在一个事务(T1)读取了将数据,接着另一个并发事务(T2)插入了一些数据时.在随后的查询中,第一个实物(T1)就会发现多了一些原本不存在的记录.就好像发生了幻卷一样,所以称为幻读.

不可重复读和幻读的区别,不可重复读的重点是修改,比如多次读取一条记录发现其中某列的值被修改.

幻读的重点在于新增和删除,比如多次读取一条记录,发现记录增多或减少了.

事务隔离级别

READ-UNCOMMITED 读未提交: 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读、不可重复读。

**READ-COMMITED 读已提交:**允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读和不可重复读礽有可能发生.

REPEATABLE-READ 可重复读: 对同一字段的多次读取结果都是一致的.除非数据是被本身事务自己修改,可以防止脏读和不可重复读.但是幻读仍有可能发生.

SERIALIZABLE 可串行化: 最高的隔离级别,完全服从ACID的隔离级别,所有的事务依次执行,这样事务之间就不可能存在干扰,也就是该级别可以防止脏读、幻读、不可重复读.

MySQL默认的隔离级别是REPEATABLE-READ

Spring Boot 设置事务隔离级别

Spring Boot的自动装配,已经为我们引入了事务,所以我们之际使用注解@Transcational操作事务即可.

Spring Boot设置事务隔离级别可以通过注解@Transcational(isolation=Isoliation.事务等级),如:

@Transcational(isolation=Isolation.REPEATABLE_READ)

Spring使用事务

使用注解的方式实现事务管理

使用注解方式实现事务管理,需要我们在配置文件中线配置事务管理器.

<bean id="transactionManager" class="org.springframework.jdbc.datasourse.DataSourceTransactionManager">
    <!--注入数据源-->
    <property name="dataSource" ref="dataSource" />
</bean>


<!--开启事务注解-->
<tx:annotation-driven transactionmanager="transactionManager"/>

在service类或者service类中的方法上添加事务的注解@Transactional,注解 参数如下:

属性名

默认值

含义

name

方法名,可以使用通配符,遵循ant风格:必填

propagation

REQUIRED

事务传播行为;可取值包括REQURIED | SUPPORTS | MANDATORY |

REQUIRES_NEW | NOT_SUPPORTED | NEVER | NESTED

isolation

DEFAULT

事务隔离级别;可取值包括DEFAULT | READ_UNCOMMITED | READ_COMMITED | REPEATABLE_TEAD | SERIALIZABLE

timeout

-1

事务超时时间,单位:秒

read-only

false

是否为只读事务

rollback-for

异常类,遇到该异常会回滚事务,默认RuntimeException或Error异常

no-rollback-for

异常类,遇到该异常时不需要回滚

完全注解方式配置事务

将xml配置文件改为使用configuration注解的配置类配置.其他不变.

xml配置文件实现事务管理

  • 配置事务管理器

  • 配置通知

  • 配置切入点和切面

    <tx:advice id="txadvice>
    tx:attributeds
    <tx:method name=“accountMoney” propagation=“REQUIRED”/>
    </tx:attrbuteds>
    </tx:advice>

    aop:config
    <aop:pointcut id=“pt” expression=“execution(全类名.(…))”/>
    <aop:advisor advice-ref=“txadvice” pointcut-ref=“pt”/>
    </aop:config>

Spring事务传播行为

  1. REQUIRED 默认的事务传播级别,他表示如果当前存在事务,则加入该事务,如果当前没有事务,则创建一个新的事务.
  2. SUPPORTS 如果当前存在事务,则加入该事务,如果当前没有事务,则以非事务的方式继续运行.
  3. MANDATORY 如果当前存在事务,则加入该事务,如果当前没有事务,抛出异常.
  4. REQUIREDS_NEW 表示创建一个新事务,如果当前存在事务,则把当前事务挂起
  5. NOT_SUPPORTED 表示以非事务方式运行,如果当前存在事务,则把当前事务挂起.
  6. NEVER 以非事务的方式运行,如果当前存在事务,抛出异常
  7. NESTED 如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来执行,如果不存在事务,则创建一个新的事物.

标签:面试题,Java,幻读,级别,事务,READ,注解,数据
From: https://blog.csdn.net/web15870125901/article/details/143418890

相关文章

  • 创建一个基于Java的图书馆管理系统
    1.需求分析明确系统的主要功能需求,例如:用户注册与登录图书信息管理(增删改查)借阅管理归还管理用户管理管理员管理功能2.技术选型确定使用的技术栈:后端:Spring,SpringMVC,MyBatis前端:HTML,CSS,JavaScript(可选框架如Vue.js或React.js)数据库:MySQL服务器:Tomcat3.......
  • Java基础篇(四)(超详细整理,建议收藏!!!)
    目录 五、数组5.1 数组的概念5.2 数组声明5.3 数组创建与初始化5.3.1 使用new创建数组5.3.2 创建数组的三种方式5.3.3 创建数组需要注意的问题5.4 数组操作5.5 数组排序5.5.1 排序(冒泡)5.5.2 Arrays.sort() 5.6  Arrays工具类5.6.1排序(s......
  • Java多线程--Thread类的那些事3.--线程的6中状态和sleep()和 join()
      一.sleep()方法  首先在Thead类中有一个静态的sleep()方法,可以让线程进入到休眠状态即TEMD-WAITING状  在调用sleep()方法时需要注意的是在哪个线程里面调用sleep()方法,哪个线程就会进入阻塞状态.,在这个线程中的其他线程不会发生阻塞,只有当休眠时间到来这个......
  • 【面试题系列Java】Java基础面试题
    对于Java开发工程师而言,掌握Java基础、数据库、框架、Java虚拟机、Java并发编程等知识是必不可少的。以下是一些常见的Java开发工程师面试题及答案,供大家参考。博主介绍上海交大毕业,大厂资深Java后端工程师《Java全套学习资料》作者专注于系统架构设计和高并发解决方......
  • java字符串中得到某个字符,字符串的遍历,截取,替换
    有点详细,请耐心找您需要的看,谢谢!1得到某个字符2:字符串的遍历3:字符串的截取4:字符串的替换//以上根据实际需要输入字符常量时别忘了带""变量就直接输入;......
  • Java进阶学习笔记64——IO流
    IO流:输入输出流,就是读写数据的。IO流的应用场景:怎么去学习IO流?1、先搞清楚IO流的分类、体系?2、再挨个学习每个IO流的作用、用法。IO流的分类:按流的方向分为:按流中数据的最小单位,分为: IO流总体上来看就有四大流:字节输入流: 把磁盘或网络中的数据以一个个......
  • Java进阶学习笔记63——字符集
    常见字符集介绍:美国人:英文字母(大小写)数字、标点符号、特殊字符。标准字符集:ASCII码:标准ASCII字符集:ASCII:美国信息交换标准代码,包括了英文、符号等。标准ASCII使用1个字节存储一个字符,首位是0,总共表示128个字符,对美国人老说完全够用。中国人自己的字符集:GBK(汉字内......
  • 基于Java+SpringBoot+Mysql实现的快递柜寄取快递系统功能实现二
    一、前言介绍:1.1项目摘要随着电子商务的迅猛发展和城市化进程的加快,快递业务量呈现出爆炸式增长的趋势。传统的快递寄取方式,如人工配送和定点领取,已经无法满足现代社会的快速、便捷需求。这些问题不仅影响了快递服务的效率,也增加了快递员和消费者的不便。在这样的背景下,快递柜......
  • 基于Java+SpringBoot+Mysql实现的快递柜寄取快递系统功能实现一
    一、前言介绍:1.1项目摘要随着电子商务的迅猛发展和城市化进程的加快,快递业务量呈现出爆炸式增长的趋势。传统的快递寄取方式,如人工配送和定点领取,已经无法满足现代社会的快速、便捷需求。这些问题不仅影响了快递服务的效率,也增加了快递员和消费者的不便。在这样的背景下,快递柜......
  • 华为OD机试-(E卷,100分) - 补种未成活胡杨(Java & Python& JS & C++ & C )
    最新华为OD机试题目描述近些年来,我国防沙治沙取得显著成果。某沙漠新种植N棵胡杨(编号1-N),排成一排。一个月后,有M棵胡杨未能成活。现可补种胡杨K棵,请问如何补种(只能补种,不能新种),可以得到最多的连续胡杨树?输入描述N总种植数量,1<=N<=100000M未成活胡杨数量,M个空格......