Spring事务(五)-事务隔离级别

Spring @Transactional注解isolation属性
@Transactional注解通过isolation属性设置事务隔离级别。如下:
@Transactional(isolation=Isolation.DEFAULT)
public void method(){}
isolation属性的值有以下五种:
1、Isolation.DEFAULT(默认)
这是默认值,表示跟连接的数据库设置的隔离级别一致。
2、Isolation.READ_UNCOMMITTED(未授权读取级别)
以操作同一行数据为前提,读事务允许其他读事务和写事务,未提交的写事务禁止其他写事务(但允许其他读事务)。此隔离级别可以防止更新丢失,但不能防止脏读、不可重复读、幻读。此隔离级别可以通过“排他写锁”实现。
3、Isolation.READ_COMMITTED(授权读取级别)
以操作同一行数据为前提,读事务允许其他读事务和写事务,未提交的写事务禁止其他读事务和写事务。此隔离级别可以防止更新丢失、脏读,但不能防止不可重复读、幻读。此隔离级别可以通过“瞬间共享读锁”和“排他写锁”实现。
4、Isolation.REPEATABLE_READ(可重复读取级别)
以操作同一行数据为前提,读事务禁止其他写事务(但允许其他读事务),未提交的写事务禁止其他读事务和写事务。此隔离级别可以防止更新丢失、脏读、不可重复读,但不能防止幻读。此隔离级别可以通过“共享读锁”和“排他写锁”实现。
5、Isolation.SERIALIZABLE(序列化级别)
提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,不能并发执行。此隔离级别可以防止更新丢失、脏读、不可重复读、幻读。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。
Spring 事务隔离级别设置为(isolation = Isolation.DEFAULT)时,以数据库的隔离级别为准。Spring 事务隔离级别设置为非(isolation = Isolation.DEFAULT)时,Spring会拿到当前会话链接,重写了数据库的隔离级别,但没有直接修改数据库的隔离级别,此时以 Spring 事务为准。
隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed。它能够避免更新丢失、脏读,而且具有较好的并发性能。尽管它会导致不可重复读、幻读这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。
事务并发产生的问题
为什么要事务隔离?如果没有事务隔离,当存在多个事务并发的时候,会产生更新丢失、脏读、不可重复读、幻读等问题。
更新丢失
两个事务都同时更新一行数据,但是第二个事务却中途失败退出,导致对数据的两个修改都失效了。
脏读
脏读又称无效数据读出。一个事务读取另外一个事务还没有提交的数据。例如,事务T1修改了一行数据,但是还没有提交,这时候事务T2读取了被事务T1修改后的数据,之后事务T1因为某种原因Rollback了,那么事务T2读取的数据就是脏的。
不可重复读
指在同一个事务内,对同一行数据的多次查询,返回了不同的结果。例如,事务T1第一次查询了某行数据,然后事务T2对这行数据的某个字段做了修改,并且提交了数据。事务T1第二次查询该行数据的时候,得到了事务T2修改过的结果。不可重复读和脏读的区别在于,脏读是读了未提交的数据,而不可重复读是读了提交了的数据。当然,不可重复读在某些情况下并不是问题,有时候我们就是要在同一事务下查询到数据的最新状态。
幻读
幻读又称虚读。同一条SQL语句在同一个事务中的多次查询,得到的数据量(条数)不一样。例如,事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。
Spring事务(五)-事务隔离级别的更多相关文章
- 数据库事务的四大特性以及事务的隔离级别-与-Spring事务传播机制&隔离级别
数据库事务的四大特性以及事务的隔离级别 本篇讲诉数据库中事务的四大特性(ACID),并且将会详细地说明事务的隔离级别. 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: ⑴ ...
- Spring事务传播机制&隔离级别
一.Propagation (事务的传播属性) Propagation : key属性确定代理应该给哪个方法增加事务行为.这样的属性最重要的部份是传播行为.有以下选项可供使用:PROPAGATION_ ...
- 数据库事务中的隔离级别和锁+spring Transactional注解
数据库事务中的隔离级别和锁 数据库事务在后端开发中占非常重要的地位,如何确保数据读取的正确性.安全性也是我们需要研究的问题.ACID首先总结一下数据库事务正确执行的四个要素(ACID): 原子性(At ...
- [转]数据库事务中的隔离级别和锁+spring Transactional注解
数据库事务中的隔离级别和锁 数据库事务在后端开发中占非常重要的地位,如何确保数据读取的正确性.安全性也是我们需要研究的问题.ACID首先总结一下数据库事务正确执行的四个要素(ACID): 原子性(At ...
- spring事物的七种事物传播属性行为及五种隔离级别
首先,说说什么事务(Transaction). 事务,就是一组操作数据库的动作集合.事务是现代数据库理论中的核心概念之一.如果一组处理步骤或者全部发生或者一步也不执行,我们称该组处理步骤为一个事务.当 ...
- 一文彻底读懂MySQL事务的四大隔离级别
前言 之前分析一个死锁问题,发现自己对数据库隔离级别理解还不够清楚,所以趁着这几天假期,整理一下MySQL事务的四大隔离级别相关知识,希望对大家有帮助~ 事务 什么是事务? 事务,由一个有限的数据库操 ...
- mysql事务之间的隔离级别
事务间未做隔离,会引起下面这些问题. 1.脏读:一个事务可读到另外一个尚未commit的事务中的数据. 2.不可重复读:在一个事务中,读取同一个数据 a,b,按顺序读取,在读a b 之间,另外一个事 ...
- Spring的四种事务特性,五种隔离级别,七种传播行为
Spring事务: 什么是事务: 事务逻辑上的一组对数据对操作,组成这些操作的各个逻辑单元,要么一起成功,要么一起失败. 事务特性(4种): 原子性(atomicity):强调事务的不可分割:一致性( ...
- Spring事务中的隔离级别
TransactionDefinition接口中定义了五个表示隔离级别的常量: TransactionDefinition.ISOLATION_DEFAULT:使用后端数据库默认的隔离界别,MySQL ...
- 事务与Mysql隔离级别
事务 定义: 比如ABCD四个业务,作为一个事务,他们要么一起都执行完毕,要么都不执行.(只要有一个不成功,那么所有的都不可以成功) 四个特性 ACID 原子性(Atomicity) 整个事务中的所有 ...
随机推荐
- TienChin 活动管理-搜索活动
ActivityController @PreAuthorize("hasPermission('tienchin:activity:list')") @GetMapping(&q ...
- Prompt learning 教学[案例篇]:文生文案例设定汇总,你可以扮演任意角色进行专业分析
Prompt learning 教学[案例篇]:文生文案例设定汇总,你可以扮演任意角色进行专业分析 1.角色扮演 行为 Prompt写法 "牙医" ""我想让你 ...
- C++ LibCurl实现Web隐藏目录扫描
LibCurl是一个开源的免费的多协议数据传输开源库,该框架具备跨平台性,开源免费,并提供了包括HTTP.FTP.SMTP.POP3等协议的功能,使用libcurl可以方便地进行网络数据传输操作,如发 ...
- idea报错 Error running GctlBrpApplication. Command line is too long. Shorten the command line and rerun.解决方案
idea新导入项目有时候会出现以下报错,解决方法如下: 一:报错截图,报错原因是命令行太长,让缩短命令长度再运行. 二:解决方法如下:在剪头标记位置加入代码: <property name=&q ...
- springboot log 没落盘
在配置文件中增加了下面的配置并不起作用. logging.file=/xx/xx.log 是因为在 springboot 2.2 版本之后上面的采纳数已经被废弃,需要用下面新的参数: logging. ...
- Oracle多租户架构之如何快速创建一个PDB
Oracle自从12c版本开始引入多租户的架构,整个管理理念也发生了很大的变化. 比如之前再小的业务只要选择了Oracle,DBA都会选择新建一套独立的数据库,因为传统的架构只能在schema级别作区 ...
- Linux用户被锁定后如何解锁
客户的一台机器,按照提供的常用密码尝试使用oracle用户登陆,超过指定次数账号被锁定,提示如下: Account locked due to 6 failed logins 这需要使用root用户解 ...
- Python Rich:美化终端显示效果
Rich库的功能就像它的名字一样,使Python编程更加丰富(rich),它帮助开发者在控制台(命令行)输出中创建丰富.多彩和具有格式化的文本. 本篇总结了如何使用Rich库让我们的命令行工具更加美观 ...
- 如何在.NET Core中为gRPC服务设计消息
如何在.NET Core中为gRPC服务设计消息 使用协议缓冲区规范定义gRPC服务非常容易,但从需求转换为.NET Core,然后管理服务的演变时,需要注意几件事. 创建gRPC服务的核心是.pro ...
- TDD学习笔记(二)单元测试
单元测试 定义 单元测试最早来源于Kent Beck,他在开发SmallTalk中引入了这个概念,随着软件工程学的不断发展,使得单元测试已经成为软件编程中一项非常有用的实践. 在维基百科中," ...