数据库 - 事务管理(ACID)隔离级别 事务传播行为

转载自   数据库 - 事务管理(ACID)隔离级别 事务传播行为

总览:

事务的4大特性(ACID)

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

事务并发访问的问题(隔离性)

脏读
两个事务正在并发的执行,事实上最后结果应该是1500才对,时间5时刻的查询余额为0就是脏数据,事务A读取了事务B中未提交的数据,这就是脏读。

时间事务A事务B
1开始事务-
2-开始事务
3-查询余额有1000
4-取出1000,余额0
5查询余额0-
6-撤销掉事务
7存入500,余额500-
8提交事务-

不可重复读
两个事务正在并发的执行,结果A两次读取的结果不一样,这是因为两次查询有间隔,期间被其他事务修改并提交了事务,相比脏读的区别是,不可重复读是读取另一事务提交的数据。这种现象也是正常的,是由于事务的隔离级造成的,但是在在某些特别的情况下也是不允许的。

时间事务A事务B
1开始事务-
2-开始事务
3-查询余额有1000
4查询余额1000-
5 取出1000,余额0
6-提交事务
7查询余额0-

幻读
两个事务正在并发的执行,事务A第一次统计和第二统计的结果不一样,是因为事务B新增了一条数据,和不可重复读一样,都是读取了另外一个事务的数据,不同的是不可重复读查询的是同一条数据,而幻读则是针对批量的数据,或者说不可重复读是A读取了B的更新数据,幻读是A读取了B的新增数据。

时间事务A事务B
1开始事务-
2-开始事务
3统计总金额10000-
4--
5 存入100
6-提交事务
7统计总金额10100-

数据库的隔离级别(MySQL为例)

明白上面的问题之后就明白为什么需要隔离级别了,不同的隔离级别能处理不同的并发事务问题,下表:

事务级别脏读不可重复读幻觉读
READ_UNCOMMITTED允许允许允许
READ_COMMITTED禁止允许允许
REPEATABLE_READ禁止禁止允许
SERIALIZABLE禁止禁止禁止

MySQL默认的事务级别是READ_COMMITTED

JDBC的数据隔离级别设置

JDBC 访问
TRANSACTION_READ_UNCOMMITTEDur就是俗称“脏读”(dirty read),在没有提交数据时能够读到已经更新的数据
TRANSACTION_READ_COMMITTEDcs在一个事务中进行查询时,允许读取提交前的数据,数据提交后,当前查询就可以读取到数据。update数据时候并不锁住表
TRANSACTION_REPEATABLE_READrs在一个事务中进行查询时,不允许读取其他事务update的数据,允许读取到其他事务提交的新增数据
TRANSACTION_SERIALIZABLErr在一个事务中进行查询时,不允许任何对这个查询表的数据修改。

Spring的事务传播行为

事务传播

事务怎么传播?方法A传播到方法B。
Spring解决的就是方法之间的事务传播。
下面看下每一种行为具体代表的含义:

REQUIRED

业务方法需要在一个事务中运行。如果方法运行时,已经处在一个事务中,那么这个时候就会加入到该事务中,如果当前没有事务环境的话,就会为自己创建一个新的事务。

SUPPORTS

这一事务属性表明,如果业务方法A在某个事务范围内被调用,则方法成为事务的一部分。如果业务方法在事务范围外被调用,则方法在没有事务的环境下执行。即当标注了事务传播属性——SUPPORTS的业务方法在另一个bean的业务方法中执行时,如果另一个bean的业务方法开启了事务,它就会处在事务中执行,如果另一个bean的业务方法也没开启事务,那么它也在没有事务的环境中进行。

MANDATORY

该属性指定业务方法只能在一个已经存在的事务中执行,业务方法不能发起自己的事务。如果业务方法在没有事务的环境下调用,容器就会抛出异常。一种比较强硬的方式。

REQUIRES_NEW

该属性表明不管当前是否存在事务,业务方法总会为自己发起一个新的事务。如果方法已经运行在一个事务中,则原有事务会被挂起,新的事务会被创建,直到方法执行结束,新事务才算结束,原先的事务才会恢复执行。

NOT_SUPPORTED

声明方法不需要事务。如果方法没有关联到一个事务,容器不会为它开启事务。如果方法在一个事务中被调用(在其他业务bean的方法中被调用了,而其他业务bean的方法是开启了事务的),该事务会被挂起,在方法调用结束后,原先的事务便会恢复执行。

NEVER

指定业务方法绝对不能在事务范围内执行。如果业务方法在某个事务中执行,容器会抛出异常,只有业务方法没有关联到任何事务,才能正常执行。比较强硬的方式,就是不支持事务。

NESTED

(嵌套事务)如果一个活动的事务存在,则当前方法运行在一个嵌套的事务中。 如果没有活动事务,就创建一个新的事务。它使用了一个单独的事务,这个事务拥有多个可以回滚的保存点。内部事务的回滚不会对外部事务造成影响。外部事务回滚会导致内部事务的回滚。如果被调用的内部方法没有捕获异常,跑出异常也会导致外部事务的回滚。

看下Spring中枚举定义的7种事务传播行为

package org.springframework.transaction.annotation;public enum Propagation {REQUIRED(0),SUPPORTS(1),MANDATORY(2),REQUIRES_NEW(3),NOT_SUPPORTED(4),NEVER(5),NESTED(6);private final int value;private Propagation(int value) {this.value = value;}public int value() {return this.value;}
}

在使用注解方式的事务时候我们可以用下面的方式来设置事务的传播行为

@Transactional(propagation = Propagation.REQUIRED)

是不是很方便。

只读事务

readOnly属性:设置为只读事务,对于只读事务,它就不能进行更新操作,一般只存在数据读取的时候,可以将readOnly属性设置为true,可提供效率。

事务超时

timeout属性:代表事务的超时时间,默认为30s,一般情况下都不需要设置超时时间。如果超过时间就回滚。

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

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

相关文章

克鲁斯卡尔算法(公交站问题)

应用场景 思路分析 代码实现 package com.atguigu.kruskal;import java.util.Arrays;/*** 创建人 wdl* 创建时间 2021/4/6* 描述*/ public class KruskalCase {private int edgNum;//边的个数private char[] vertexs;//顶点数组private int[][] matrix;//邻接矩阵//使用INF表示…

分布式系列文章——Paxos算法原理与推导

Paxos算法在分布式领域具有非常重要的地位。但是Paxos算法有两个比较明显的缺点:1.难以理解 2.工程实现更难。 网上有很多讲解Paxos算法的文章,但是质量参差不齐。看了很多关于Paxos的资料后发现,学习Paxos最好的资料是论文《Paxos Made Simp…

java的jdbc驱动server_win7下java用jdbc驱动来连接sql server的方法 (转载)

第一步:下载安装Microsoft SQL Server 2000 Service Pack 4,也就是sql2000的sp4补丁地址如下:第二步:下载jdbc的驱动,解压到任一位置中,下载地址:第三步:就是创建一个java工程,再在w…

2018蓝桥杯省赛---java---B---7(螺旋折线)

题目描述 标题:螺旋折线如图p1.png所示的螺旋折线经过平面上所有整点恰好一次。 对于整点(X, Y),我们定义它到原点的距离dis(X, Y)是从原点到(X, Y)的螺旋折线段的长度。 例如dis(0, 1)3, dis(-2, -1)9 给出整点坐标(X, Y),你能计算出dis…

微软的.NET Core开始支持Raspberry Pi 3

微软的 .NET Core 正在向 Raspberry Pi 3 发展,并且适用于 ARM 设备的官方 .NET 2.0 核心将于今年晚些时候发布。微软最近开放了 .NET 核心的编程框架,目前的 ARM32 版本,在 Github 上可用,是多方合作的产物。 一位微软发言人告诉…

轩辕剑之天之痕1-5java_轩辕剑游戏 轩辕剑1到5全系列下载

第 5 页 轩辕剑3外传:天之痕【轩辕剑3外传:天之痕(2000)】本作可以说是轩辕剑最有名气的作品!!!没错,一直以来轩辕剑名声最响亮的一部作品就是《天之痕》,到现在电视剧也终于拍出来了&#xff0…

2019蓝桥杯省赛---java---B---2(不同子串)

题目描述 思路分析 看到不同,想到set去重 截取想到String.substring() 代码实现 package com.atguigu.TEST;import java.util.HashSet; import java.util.Set;class Main{public static void main(String[] args) {String target"0100110001010001";Se…

ASP.NET Core 程序发布到Linux(Centos7)爬坑实战

前言 前阶段弄了个Linux系统想倒腾倒腾.NET Core,结果看了下网上的资料,大部分都是过期的,走了不少弯路,不过还好,今下午总算捣鼓出来了。Linux命令太多了,唉。血的教训:安装一定要看官网的流程。 开始 首先…

2019蓝桥杯省赛---java---B---3(数列求值)

题目描述 思路分析 此题类似于斐波那契数列,但是所求20190324项的最后四位数字,要是单纯按照斐波那契数列的思想求下去, 别说long类型,BigInteger类型都存不了这么大的数,然后我们发现,所求20190324项的最…

Visual Studio 2017 ASP.NET Core开发

Visual Studio 2017 ASP.NET Core开发,Visual Studio 2017 已经内置ASP.NET Core 开发工具. 在选择.NET Core 功能安装以后就可以进行ASP.NET Core开发。 新的ASP.NET Core项目为csproj ,打开之前的xproj项目,会提示单向升级,确认以后&#x…

2019蓝桥杯省赛---java---B---4(数的分解)

题目描述 思路分析 方案一&#xff1a;不定顺序&#xff1a;要除以6. 方案二&#xff1a;人为规定&#xff1a;a < b < c 代码实现 方案一 package com.atguigu.TEST;class Main{public static void main(String[] args) {int sum0;for (int i 1; i <1999; i) {f…

分布式一致性算法:Raft 算法

由于微信字数的限制&#xff0c;此处给出的并非全文&#xff0c;请拉到页面最下方点击阅读原文查看完整版。 Raft 算法是可以用来替代 Paxos 算法的分布式一致性算法&#xff0c;而且 raft 算法比 Paxos 算法更易懂且更容易实现。本文对 raft 论文进行翻译&#xff0c;希望能有…

聚集索引、辅助索引、覆盖索引、联合索引

转载自 聚集索引、辅助索引、覆盖索引、联合索引 聚集索引&#xff08;Clustered Index&#xff09; 聚集索引就是按照每张表的主键构造一棵B树&#xff0c;同时叶子节点中存放的即为整张表的行记录数据。 举个例子&#xff0c;直观感受下聚集索引。 创建表t&#xff0c;…

2019蓝桥杯省赛---java---B---6(特别数的和)

题目描述 时间限制: 1.0s 内存限制: 512.0MB 本题总分&#xff1a;15 分【问题描述】小明对数位中含有 2、0、1、9 的数字很感兴趣&#xff08;不包括前导 0&#xff09;&#xff0c;在 1 到 40 中这样的数包括 1、2、9、10 至 32、39 和 40&#xff0c;共 28 个&#xff0c;他…

.NET Core项目部署到linux(Centos7)

1.开篇说明 a 上篇博客简单的说明了一下 使用.NET Core开发的一个总结&#xff08;.NET Core跨平台&#xff1a;使用.NET Core开发一个初心源商城总括)&#xff0c;那么这篇博客我们就在上一篇博客的基础上对其代码进行部署&#xff0c;将其部署在Linux Centos7下。 b 这周周二…

2020蓝桥杯省赛---java---B---1(指数计算)

题目描述 代码实现 解法一 计算器 解法二 package com.atguigu.lanqiao;import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner input new Scanner(System.in);int a1,b1921,c7;for (int i 0; i < 2020; i) {aa*7;if(a>1…

ASP.NET Core 优雅的在开发环境保存机密(User Secrets)

前言 在应用程序开发的过程中&#xff0c;有的时候需要在代码中保存一些机密的信息&#xff0c;比如加密密钥&#xff0c;字符串&#xff0c;或者是用户名密码等。通常的做法是保存到一个配置文件中&#xff0c;在以前我们会把他保存到web.config中&#xff0c;但是在ASP.NET C…

震惊,中国历朝历代疆域变迁视频【高清】

中国历代疆域指的是从古至今中国领土变化过程的历史&#xff0c;期间经过数千年的发展历程。 中国疆域自远古以来不断演进变化&#xff0c;从《尚书禹贡》九州开始直到唐朝极盛时疆域:被认为是中国疆域原型。至元朝时不仅统一中国&#xff0c;西藏地方从此正式纳入中国中央政府…

2020蓝桥杯省赛---java---B---2(指数计算)

题目描述 【问题描述】 小明设计了一种文章加密的方法&#xff1a;对于每个字母 c&#xff0c;将它变成某个另外的字符 Tc。下表给出了字符变换的规则&#xff1a; 例如&#xff0c;将字符串 YeRi 加密可得字符串 EaFn。 小明有一个随机的字符串&#xff0c;加密后为 EaF…

java项目新东方在线源码_[VIP源码]【S019】SSM框架开发智夫子在线考试系统项目源码 百度云盘...

java源码项目名称&#xff1a;SSM框架开发智夫子在线考试系统项目源码ssm项目源码5 y& C [0 w! J% F1 n8 z J百度网盘下载链接&#xff1a;4 B i* }. G4 }8 |7 l% G8 游客&#xff0c;如果您要查看本帖隐藏内容请->>回复[/hide]_* r Q0 _! W1 K4 Q" U6 F密码: …