Java提升篇-事务隔离级别和传播机制

转载自 Java提升篇-事务隔离级别和传播机制

问题的提出


为了保证并发操作数据的正确性及一致性,SQL规范于1992年提出了数据库事务隔离级别。


事务隔离级别分类


事务隔离级别由低往高可分为以下几类


  • READ UNCOMMITTED,读取未提交的数据。


    这是最不安全的一种级别,查询语句在无锁的情况下运行,并能读取到别的未提交的数据,造成脏读,如果未提交的那个事务数据全部回滚了,而之前读取了这个事务的数据即是脏数据,这种数据不一致性读造成的危害是可想而知的。


  • READ COMMITTED,读取已提交的数据。


        一个事务只能读取数据库中已经提交过的数据,解决了脏读问题,但不能重复读,即一个事务内的两次查询返回的数据是不一样的。如第一次查询金额是100,第二次去查询可能就是50了,这就是不可重复读取。

       

  • REPEATABLE READ,可重复读取数据,这也是Mysql默认的隔离级别。


     一个事务内的两次无锁查询返回的数据都是一样的,但别的事务的新增数据也能读取到。比如另一个事务插入了一条数据并提交,这个事务第二次去读取的时候发现多了一条之前查询数据列表里面不存在的数据,这时候就是传说的中幻读了。这个级别避免了不可重复读取,但不能避免幻读的问题。


  • SERIALIZABLE,可串行化读。


    这是效率最低最耗费资源的一个事务级别,和可重复读类似,但在自动提交模式关闭情况下可串行化读会给每个查询加上共享锁和排他锁,意味着所有的读操作之间不阻塞,但读操作会阻塞别的事务的写操作,写操作也阻塞读操作。


上面介绍了4种事务隔离级别及脏读、不可重复读、幻读与它们的联系,对应的关系表如下:


事务隔离级别脏读不可重复读幻读
读取未提交
读取已提交

   ×

可重复读

   ×

   ×

可串行化读

   ×

   ×

  ×


Mysql官方对于事务级别的定义可参考:

https://dev.mysql.com/doc/refman/5.7/en/innodb-transaction-isolation-levels.html


扩展


上面介绍的是Mysql的事务隔离级别,那跟spring中的事务隔离级别有什么必然的联系呢?


spring就是对数据库事务进行了封装而已,并提了5种事务隔离级别和7种事务传播机制。


5种事务隔离级别

ISOLATION_DEFAULT

spring将使用数据库中默认的事务隔离级别。

下面四种定义和上面一致。

ISOLATION_READ_UNCOMMITTED 4 p" L. I' F; k1 {) a. D( E5 ?: V

ISOLATION_READ_COMMITTED

ISOLATION_REPEATABLE_READ

ISOLATION_SERIALIZABLE


7种事务传播机制

REQUIRED

如果当前方法有事务则加入事务,没有则创建一个事务。


NOT_SUPPORTED

不支持事务,如果当前有事务则挂起事务运行。


REQUIREDS_NEW

新建一个事务并在这个事务中运行,如果当前存在事务就把当前事务挂起。新建的事务的提交与回滚一挂起事务没有联系,不会影响挂起事务的操作。


MANDATORY

强制当前方法使用事务运行,如果当前没有事务则抛出异常。


NEVER

当前方法不能存在事务,即非事务状态运行,如果存在事务则抛出异常。


SUPPORTS

支持当前事务,如果当前没事务也支持非事务状态运行。


NESTED

如果当前存在事务,则在嵌套事务内执行。嵌套事务的提交与回滚与父事务没有任务关系,反之,当父事务提交嵌套事务也一起提交,父事务回滚会也回滚嵌套事务的。

如果当前没有事务,则新建一个事务运行,这时候则与PROPAGATION_REQUIRED场景一致。



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/330564.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多个会话对表加表级读锁和表级写锁后的操作权限分析(表级读锁+表级写锁)

【0】README: 不论是加读锁还是写锁,必须要等到其他数据库连接关闭后才可以进行; 【1】添加表级读锁 1.1)多会话执行的时序操作分析: 1.2)session1执行的具体时序操作; mysql> select * …

如何写登录验证

如何写登录验证 开发工具与关键技术:Visual Studio、MVC 作者:幻奏 撰写时间:2019.05.12我们都知道很多网站都会有登录的界面,目的就是要验证你的账号是否正确,不正确就不能登录,这样就能防止有其他目的的…

关于Java序列化你应该知道的一切

转载自 关于Java序列化你应该知道的一切 什么是序列化 我们的对象并不只是存在内存中,还需要传输网络,或者保存起来下次再加载出来用,所以需要Java序列化技术。 Java序列化技术正是将对象转变成一串由二进制字节组成的数组,可以通…

mysql事务基础+基于innodb的行锁+间隙锁+如何锁定行

【0】README outlines are as follows : 行锁;事务;隔离级别;行锁变表锁;间隙锁;如何锁定一行;行锁总结; 【1】行锁事务存储引擎基础 1、行锁: 偏向于 innodb 存储引擎&#xff0c…

页面跳转、嵌套

页面跳转、嵌套 开发工具与关键技术:Visual Studio、MVC 作者:幻奏 撰写时间:2019.05.16在日常浏览网页的时候,我们常常能看到很多不同样式的网页,其中我们用的最多的应该就是跳转了,点击链接跳转、点击按…

Java高级进阶:自定义ClassLoader

转载自 Java高级进阶:自定义ClassLoader 假如我们的类不在classpath下,而我们又想读取一个自定义的目录下的class,如果做呢? 读取自定义目录的类 示例读取c:/test/com/test.jdk/Key.class这个类。 package com.test.jdk;public…

mysql如何分析sql执行效率和进行效率优化

【0】如何分析mysql中sql执行较慢的问题 步骤1、观察,至少跑一天,看看生产的慢sql情况;步骤2、开启慢查询日志,设置阈值,比如超过5秒钟就是慢sql, 并将它抓取出来;步骤3、explain慢sql分析&…

如何把模型表导入数据库

开发工具与关键技术:Power Designer、SQL 作者:幻奏 撰写时间:2019.05.23事先说明,我只是一个小萌新,我分享的文章是我在学习过程中学到的,不代表全是正确的,所以我要是有什么地方说错了&#x…

解决eclipse中tomcat无法识别maven web项目问题

eclipse工具中导入了maven web项目, 但是tomcat死活都识别不了, maven项目进行了clean install等操作, 但是仍无效, 后在网上搜索到以下答案, 解决问题 1. 右击项目 -> Debug As -> Maven build... 2. 在Goals中填入: -Dwtpversion2.0 eclipse:eclipse 对于WTP(Web Tool…

深入理解CAS算法原理

转载自 深入理解CAS算法原理1、什么是CAS?CAS:Compare and Swap,即比较再交换。jdk5增加了并发包java.util.concurrent.*,其下面的类使用CAS算法实现了区别于synchronouse同步锁的一种乐观锁。JDK 5之前Java语言是靠synchronized关键字保证同…

如何写登录的记住账号

开发工具与关键技术:Visual Studio、MVC 作者:幻奏 撰写时间:2019.05.27上次我把如何登录的代码给写了,却没有写如何记住登录的账号密码,所以现在我就简单的写一下是如何记住账号密码的。 如果我们没写记住密码的话&am…

严重: Error configuring application listener of class org.springframework.web.context.ContextLoaderLis

博主 使用Eclipse 下的Mavn搭建的SSM框架的工程,出现以下错误 严重: Error configuring application listener of class org.springframework.web.context.ContextLoaderListener Java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoad…

java高级应用:线程池全面解析

转载自 java高级应用:线程池全面解析 什么是线程池? 很简单,简单看名字就知道是装有线程的池子,我们可以把要执行的多线程交给线程池来处理,和连接池的概念一样,通过维护一定数量的线程池来达到多个线程的复…

如何用for循环出数据库的数据

开发工具与关键技术:Visual Studio、MVC 作者:幻奏 撰写时间:2019.5.30在客房管理的系统中有很多不同的小格子,它们分别代表了不同的房间,可以动态的显示每间房间的状态,这个就是房态图。有很多系统应该都有…

Maven常见问题之【-Dmaven.multiModuleProjectDirctory system property is not set】

配置jdk时,声明vm参数,如下, 且需要保证 M2_HOME 环境变量已经配置了, 如下: C:\Users\pacoson>echo %M2_HOME% D:\software_cluster\apache-maven-3.3.9 -Dmaven.multiModuleProjectDirectory$M2_HOME

实现java多线程的3种方式,99%人没用过第3种

转载自 实现java多线程的3种方式,99%人没用过第3种 实现多线程的3种方式 1、继承Thread类 看jdk源码可以发现,Thread类其实是实现了Runnable接口的一个实例,继承Thread类后需要重写run方法并通过start方法启动线程。 继承Thread类耦合性太强了…

关于时间类型的问题

开发工具与关键技术:Visual Studio、MVC 作者:幻奏 撰写时间:2019.6.2我在做项目的时候遇到了一个问题,我要把时间显示到表格上,然后我像平常那样写,linq查询,然后返回数据,然后加载…

maven项目不编译xml文件

最近在搭建一个mavenspringMVCmybatis的项目&#xff0c;编译的时候mybatis生成的**Mapper.xml文件总是不编译&#xff08;classes文件夹内没有出现&#xff09;。 解决方法是在maven的pom.xml文件夹<build>标签下增加如下代码&#xff08;build标签的父标签是 project标…

多线程并发神器--ThreadLocal

转载自 多线程并发神器--ThreadLocal什么是ThreadLocal可以理解成线程本地变量&#xff0c;传统的线程对一个变量操作时操作的是同一个对象&#xff0c;也存在线程安全的问题。ThreadLocal是一个变量的本地副本&#xff0c;线程对变量的操作不会影响其他线程。首先看看ThreadLo…

如何获取复选框的值

开发工具与关键技术&#xff1a;Visual Studio、MVC 作者&#xff1a;幻奏 撰写时间&#xff1a;2019.6.7我们在很多地方都用到了复选框&#xff0c;数据表格里也有复选框&#xff0c;新增数据时也可能要复选框&#xff0c;修改时也要回填复选框&#xff0c;所以我们用到的地方…