链接:https://www.nowcoder.com/questionTerminal/1c65d30e47fb4f59a5e5af728218cac4?orderByHotValue=2&pos=5&mutiTagIds=637
来源:牛客网

事务属性的种类:


 


传播行为、隔离级别、只读和事务超时


 


a)



传播行为定义了被调用方法的事务边界。


 


传播行为


意义


PROPERGATION_MANDATORY


表示方法必须运行在一个事务中,如果当前事务不存在,就抛出异常


PROPAGATION_NESTED


表示如果当前事务存在,则方法应该运行在一个嵌套事务中。否则,它看起来和
PROPAGATION_REQUIRED


看起来没什么俩样


PROPAGATION_NEVER


表示方法不能运行在一个事务中,否则抛出异常


PROPAGATION_NOT_SUPPORTED


表示方法不能运行在一个事务中,如果当前存在一个事务,则该方法将被挂起


PROPAGATION_REQUIRED


表示当前方法必须运行在一个事务中,如果当前存在一个事务,那么该方法运行在这个事务中,否则,将创建一个新的事务


PROPAGATION_REQUIRES_NEW


表示当前方法必须运行在自己的事务中,如果当前存在一个事务,那么这个事务将在该方法运行期间被挂起


PROPAGATION_SUPPORTS


表示当前方法不需要运行在一个是事务中,但如果有一个事务已经存在,该方法也可以运行在这个事务中


 


 


 


 


b)



隔离级别


在操作数据时可能带来
3


个副作用,分别是脏读、不可重复读、幻读。为了避免这
3


中副作用的发生,在标准的
SQL


语句中定义了
4


种隔离级别,分别是未提交读、已提交读、可重复读、可序列化。而在
spring


事务中提供了
5


种隔离级别来对应在
SQL


中定义的
4


种隔离级别,如下:


隔离级别


意义


ISOLATION_DEFAULT


使用后端数据库默认的隔离级别


ISOLATION_READ_UNCOMMITTED


允许读取未提交的数据(对应未提交读),可能导致脏读、不可重复读、幻读


ISOLATION_READ_COMMITTED


允许在一个事务中读取另一个已经提交的事务中的数据(对应已提交读)。可以避免脏读,但是无法避免不可重复读和幻读


ISOLATION_REPEATABLE_READ


一个事务不可能更新由另一个事务修改但尚未提交(回滚)的数据(对应可重复读)。可以避免脏读和不可重复读,但无法避免幻读


ISOLATION_SERIALIZABLE


这种隔离级别是所有的事务都在一个执行队列中,依次顺序执行,而不是并行(对应可序列化)。可以避免脏读、不可重复读、幻读。但是这种隔离级别效率很低,因此,除非必须,否则不建议使用。


 


 


 


 


c)



只读


如果在一个事务中所有关于数据库的操作都是只读的,也就是说,这些操作只读取数据库中的数据,而并不更新数据,那么应将事务设为只读模式(
READ_ONLY_MARKER



,


这样更有利于数据库进行优化




因为只读的优化措施是事务启动后由数据库实施的,因此,只有将那些具有可能启动新事务的传播行为
(PROPAGATION_NESTED



PROPAGATION_REQUIRED



PROPAGATION_REQUIRED_NEW)


的方法的事务标记成只读才有意义。


如果使用
Hibernate


作为持久化机制,那么将事务标记为只读后,会将
Hibernate



flush


模式设置为
FULSH_NEVER,


以告诉
Hibernate


避免和数据库之间进行不必要的同步,并将所有更新延迟到事务结束。


d)



事务超时


如果一个事务长时间运行,这时为了尽量避免浪费系统资源,应为这个事务设置一个有效时间,使其等待数秒后自动回滚。与设


置“只读”属性一样,事务有效属性也需要给那些具有可能启动新事物的传播行为的方法的事务标记成只读才有意义。

Spring事物的属性的更多相关文章

  1. Spring 事物注解属性

    @Transactional属性 . propagation 事物的传播属性 . isolation 事物的隔离属性 . readonly 设置只读属性 . timeout 设置超时属性 . roll ...

  2. spring事物传播属性

    PROPAGATION_REQUIRED Support a current transaction; create a new one if none exists.  支持一个当前事务;如果不存在 ...

  3. spring事物的七种事物传播属性行为及五种隔离级别

    首先,说说什么事务(Transaction). 事务,就是一组操作数据库的动作集合.事务是现代数据库理论中的核心概念之一.如果一组处理步骤或者全部发生或者一步也不执行,我们称该组处理步骤为一个事务.当 ...

  4. MyBatis6:MyBatis集成Spring事物管理(下篇)

    前言 前一篇文章<MyBatis5:MyBatis集成Spring事物管理(上篇)>复习了MyBatis的基本使用以及使用Spring管理MyBatis的事物的做法,本文的目的是在这个的基 ...

  5. spring事物的传播行为

    1.spring事物的传播行为,主要是用来解决业务层拥有事物的方法,相互调用的问题. 2.声明事物, 在代码执行前,开启事务.代码执行完,提交事务 3.spring并没有提供事务具体的处理,而只是调用 ...

  6. Spring 事物Transaction

    日常开发中Spring 为我们提供了两种事物的定义方式 XML 配置 方式 :这种方式配置起来比较麻烦,但后期比较好进行维护 注解方式:配置起来比较方便,也是日常开发常用的: 我们这里进行第二种注解的 ...

  7. 细说spring事务配置属性

    一.spring事务配置 1.spring配置 在配置数据源的下方配置 <!-- 事务配置 --> <bean id="transactionManager" c ...

  8. spring事物深入了解

    1.问题 1.以前对事物的了解只是停留在声明式事物,配置xml,或使用注解,事物的传播行为也只用过REQUIRED和SUPPORTS,可以说对事物的了解很模糊. 2.直到在开发中遇到问题.. 问题的描 ...

  9. spring 事物的一些理解

    推荐一个我认为Spring事物写得很好的文章. 文章链接:http://www.codeceo.com/article/spring-transactions.html  文章作者:码农网 – 吴极心 ...

随机推荐

  1. PHP 事务写法

    $md=new Model(); //创建事务 $md->startTrans(); //开始事务 $md->table("ym_xxx")->where(&qu ...

  2. html概述和基本结构

    html概述 HTML是 HyperText Mark-up Language 的首字母简写,意思是超文本标记语言,超文本指的是超链接,标记指的是标签,是一种用来制作网页的语言,这种语言由一个个的标签 ...

  3. Speech语音播报

    System.Speech 这个命名空间,报可以阅读文字和播放音频. 环境  W10 VS2017 CMMT 1.添加程序集引用 System.Speech 2.实例化播音类,并且播放一个文本 Spe ...

  4. 搭建高可用的Redis服务,需要注意这些方面!

    搭建高可用的Redis服务,需要注意这些方面! HorstXu 占小狼的博客 今天 ◎作者 | HorstXu www.cnblogs.com/xuning/p/8464625.html 基于内存的R ...

  5. Vue--组件嵌套

    1.全局注册: 组件放到components文件夹内,建议组件名是什么行为的name名就是什么 main.js 引入组件:import Users from '组件位置' 注册全局组件:Vue.com ...

  6. 把axios封装为vue插件使用

    前言 自从Vue2.0推荐大家使用 axios 开始,axios 被越来越多的人所了解.使用axios发起一个请求对大家来说是比较简单的事情,但是axios没有进行封装复用,项目越来越大,引起的代码冗 ...

  7. hdu 3530 "Subsequence" (单调队列)

    传送门 题意: 给出一个序列,求最长的连续子序列,使得 m ≤ Max-Min ≤ k 我的理解: 定义数组 a[] 存储输入的 n 个数: 定义两个双端队列: deque<int >qM ...

  8. SCU-4437 Carries

    https://blog.csdn.net/catglory/article/details/46539283 https://blog.csdn.net/u012127882/article/det ...

  9. 桌面面板和内部窗体JDeskPane、JInternalFrame

    桌面面板和内部窗体JDeskPane.JInternalFrame,内部窗体必须在桌面面板里. import javax.swing.*; import java.awt.*; public clas ...

  10. 退回win7后无法上网 的解决方法

    如果网卡驱动没问题的话,那你是不是装了360安全卫士,如果装了你打开网络和共享中心———更改适配器设置————右键本地连接———属性————把360局域网防护驱动程序前面的对勾去掉然后确定,一般就能解 ...