spring的事务隔离级别「建议收藏」

spring的事务隔离级别「建议收藏」spring的事务隔离级别

大家好,又见面了,我是你们的朋友全栈君。

事务特征

⑴ 原子性(Atomicity)
  原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。
⑵ 一致性(Consistency)
  一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
  拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。
⑶ 隔离性(Isolation)
  隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
  即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。
  关于事务的隔离性数据库提供了多种隔离级别,稍后会介绍到。
⑷ 持久性(Durability)
  持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
  例如我们在使用JDBC操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务以及正确提交,即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成,否则就会造成我们看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。

事务产生的问题

场景:同一个事务内(同一个服务内)

名称 数据的状态 实际行为 产生原因
脏读 未提交 打算提交但是数据回滚了,读取了提交的数据 数据的读取
不可重复读 已提交 读取了修改前的数据 数据的修改
幻读 已提交 读取了插入前的数据 数据的插入

事务隔离级

名称 结果 脏读 不可重复读 幻读
Read UnCommitted(读未提交) 什么都不解决
Read Committed(读提交) 解决了脏读的问题
Repeatable Read(重复读) (mysql的默认级别)解决了不可重复读 )
Serializable(序列化) 解决所有问题
  • READ UNCOMMITTED(读未提交数据):允许事务读取未被其他事务提交的变更数据,会出现脏读、不可重复读和幻读问题。
  • READ COMMITTED(读已提交数据):只允许事务读取已经被其他事务提交的变更数据,可避免脏读,仍会出现不可重复读和幻读问题。
  • REPEATABLE READ(可重复读):确保事务可以多次从一个字段中读取相同的值,在此事务持续期间,禁止其他事务对此字段的更新,可以避免脏读和不可重复读,仍会出现幻读问题。
  • SERIALIZABLE(序列化):确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其他事务对该表执行插入、更新和删除操作,可避免所有并发问题,但性能非常低。

Spring隔离级别

    int ISOLATION_DEFAULT = -1;   默认采用数据库的隔离级
    int ISOLATION_READ_UNCOMMITTED = Connection.TRANSACTION_READ_UNCOMMITTED;   //0000 0001 -> 1 
    int ISOLATION_READ_COMMITTED = Connection.TRANSACTION_READ_COMMITTED;       //0000 0010-> 2
    int ISOLATION_REPEATABLE_READ = Connection.TRANSACTION_REPEATABLE_READ;     //0000 0100-> 4
    int ISOLATION_SERIALIZABLE = Connection.TRANSACTION_SERIALIZABLE;          // 0000 1000-> 8

spring事务7种传播行为

在这里插入图片描述一、Propagation :
  key属性确定代理应该给哪个方法增加事务行为。这样的属性最重要的部份是传播行为。有以下选项可供使用:
PROPAGATION_REQUIRED–支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION_SUPPORTS–支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY–支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW–新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED–以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER–以非事务方式执行,如果当前存在事务,则抛出异常。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/106633.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 《哈佛大学公开课:幸福课》 学习笔记(1)

    《哈佛大学公开课:幸福课》 学习笔记(1)视频链接:http://v.163.com/special/sp/positivepsychology.html当初《幸福课》在网易公开课很火,当然现在也很火。但是由于对门户热门内容的成见,再加上一个江湖骗子式的课程名字,我还以为是又一个简单空洞的心灵鸡汤。但是今天看完了第一节课,事实告诉我,真是要相信群众的眼睛呀,而且随便怀疑哈佛出品也未免太过自信。70+分钟的时间内,没有多少废话,反复

    2022年7月18日
    16
  • DatabaseMetaData的简单使用

    DatabaseMetaData的简单使用在看大佬写的一个导出数据库建标脚本的接口的时候,发现频频用到DataBaseMetaData这个类,之前也没有用过这个类下的API,记录一下心得用法。DatabaseMetaData是java.sql包中的接口,利用它可以获取我们连接到的数据库的结构、存储等很多信息;先上个API文档:这英文看的是心力憔悴,直接来看这个接口…

    2022年6月19日
    32
  • IE11打不开网页, 所有菜单都被禁用了。

    IE11打不开网页, 所有菜单都被禁用了。

    2021年8月29日
    82
  • udp数据包大小问题

    udp数据包大小问题参考 UDP 数据包大小问题几个关键点 1 以太网 Ethernet 在数据链路层 数据帧的长度必须在 46 1500 字节之间 这个 1500 字节被称为链路层的 MTU 最大传输单元 已经减去首部和尾部的 18 字节 这个 1500 字节就是网络层 IP 数据报的长度限制 因为 IP 数据报的首部为 20 字节 所以 IP 数据报的数据区长度最大为 1480 字节 而这个 1480 字节就是用来放 TCP 传来的 TCP 报文段或 UD

    2025年10月22日
    4
  • 交流转直流降压、稳压电路「建议收藏」

    交流转直流降压、稳压电路「建议收藏」目录目录降压稳压原理图设计思路电路图及原件原理图理解成果展示降压稳压原理图桥式整流电容滤波电路(最常用电路,本博客电路):全波整流电容滤波电路:-二倍压整流电容滤波电路:设计思路电路图及原件原件:PCB洞洞板、220V~12V变压器、7805稳压管、二极管*4、1000uF电解电容、10uF电解电容*2、…

    2022年6月20日
    27
  • 郑州java面试难吗_java开发人员培训机构

    郑州java面试难吗_java开发人员培训机构前言周末花了2天时间学习了额RabbitMQ,总结了最核心的知识点,带大家快速掌握RabbitMQ,整理不易希望帮忙点赞,转发,分享下,谢谢目录进入SpringBoot世界讲述Sping、SpringBoot和SpringCloud之间的关系,还重点讲述了如何利用开发工具(如IDEA)来实现开发,如何通过API文档来寻找类对象方法,告诉我们在开发过程中如何学习、发现和解决问题需要免费领取这份Alibaba架构师耗时一年整理的《SpringBoot实战,让你的开发像搭积木一样简单

    2022年9月28日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号