开发者社区> java技术栈> 正文

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

简介: 问题的提出 为了保证并发操作数据的正确性及一致性,SQL规范于1992年提出了数据库事务隔离级别。 事务隔离级别分类 事务隔离级别由低往高可分为以下几类 READ UNCOMMITTED,读取未提交的数据。
+关注继续查看

问题的提出

为了保证并发操作数据的正确性及一致性,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_UNCOMMITTED4 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场景一致。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
事务隔离级别
尽管数据库为用户提供了锁的DML操作方式,但直接使用锁管理是非常麻烦的,因此数据库为用户提供了自动锁机制。只要用户指定会话的事务隔离级别,数据库就会分析事务中的SQL语句,然后自动为事务操作的数据资源添加上适合的锁。
868 0
事务隔离级别|学习笔记
快速学习事务隔离级别
46 0
Java提升篇-事务隔离级别和传播机制
问题的提出 为了保证并发操作数据的正确性及一致性,SQL规范于1992年提出了数据库事务隔离级别。 事务隔离级别分类 事务隔离级别由低往高可分为以下几类 READ UNCOMMITTED,读取未提交的数据。
1034 0
升级 | Java开源诊断工具 Arthas 发布v3.1.0
Arthas 自2018年9月份上线以来「传送门」,已收获近万个star,感谢开发者们的认可。此次Arthas 3.1.0版本的发布,不仅带来大家投票出来的新LOGO,还带来强大的新功能和更好的易用性,下面一一介绍。
8277 0
Mysql 事务隔离级别 与 读出现的问题实验
Mysql 事务隔离级别 与 读出现的问题实验 读未提交:一个事务的隔离级别为‘读未提交’,它可以读取其他事务未提交的数据 读已提交:一个事务的隔离级别为‘读已提交’,它只可以读其他事务已提交的数据 可重复读:一个事务的隔离级别为‘可重复读’,不关心其他事务的操作,整个事务内读取的数据一致。
2472 0
事务与事务隔离级别-MySQL
事务 隔离级别 MySQL
51 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
19696 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
17986 0
+关注
java技术栈
Java技术栈是一个以 Java 技术为主的原创技术公众号。分享技术包括但不限于 Java 核心技术、多线程编程、Spring Boot、Spring Cloud、缓存、消息队列、架构设计等各种技术干货、Java 面试题、各种技术教程、行业动态等。
301
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载