mysql,oracle,sql server中的默认事务隔离级别查看

 一 、事务

一个事务中的一系列的处理操作要么全部成功,要么全部失败。在数据库操作中,一项事务(Transaction)是由一条或多条操作数据库的SQL语句组成的一个不可分割的工作单元。

事务的处理结果有两种:

1)当事务中的所有步骤全部成功执行时,事务提交,成功;

2)如果其中任何一个步骤失败,该事务都将发生回滚操作,撤销已执行的所有操作。

 二、事务四大特性(ACID)

2.1 原子性(Atomic)

表示将事务中所进行的操作捆绑成一个不可分割的单元,即对事务所进行的数据修改等操作,要么全部执行,要么全不执行;如果失败,就回滚到事务开始前的状态。

2.2 一致性(Consistency)

事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。

2.3 隔离性(Isolation)

指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

2.4 持久性(Durability)

持久性也称永久性(permanence),持久性就是指如果事务一旦被提交,数据库中数据的改变就是永久性的,即使断电或者宕机的情况下,也不会丢失提交的事务操作。

三 、隔离性详解以及事务的并发问题

说明:隔离性是指,多个用户的并发事务访问同一个数据库时,一个用户的事务不应该被其他用户的事务干扰,多个并发事务之间要相互隔离。

事务隔离性的重要性:事务的隔离性主要是从提升数据库的数据处理速度,即并发角度考虑的;换句话说,事务隔离性和整体数据库的性能/并发执行,有直接决定性作用。

一个思维模式:想要理解一个知识点,就假设如果没有该点会有什么发生;事务隔离性也是,如果事务中没有隔离性这个概念,会发生点啥事?

在实际应用中,数据库中性能的好坏标准之一就是数据能被尽可能多的用户共同访问,当多个用户同时处理同一数据时,可能就会出现一些事务的并发问题,导致如下四种情况出现:

3.1)脏读

指一个事务读取到另一个事务未提交的数据。

3.2)幻读

指一个事务执行两次查询,但第二次查询的结果包含了第一次查询中未出现的数据。

举例:事务1读取一个表期间,事务2对表做了delete/update/insert操作并提交,事务1再次读取表时,此时读取到事务2操作的记录,两次操作结果不一致。

3.3)不可重复读

指一个事务对同一行数据重复读取两次,但得到的结果不同。

举例:事务1读取表的一条数据期间,事务2更新了该条记录并提交,事务1再次读取该表该条记录时,发现和第一次内容不一致。

这里,有朋友会问,不可重复读和幻读这不一样吗?

答案为:不一样。有啥区别?

幻读和不可重复读都是读取了另一条已经提交的事务;但不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。

不可重复读和幻读是初学者不易分清的概念;简单来说,解决不可重复读的方法是大家常说的加行锁,解决幻读方式是加表锁

3.4)丢失更新

指两个事务同时更新一行数据,后提交(或撤销)的事务将之前事务提交的数据覆盖了。

注意:丢失更新可分为两类,分别为第一类丢失更新和第二类丢失更新。

第一类丢失更新:两个事务同时操作同一个数据时,当第一个事务撤销时,把已经提交的第二个事务的更新数据覆盖了,第二个事务就造成了数据丢失。

第二类丢失更新:当两个事务同时操作同一个数据时,第一个事务将修改结果成功提交后,对第二个事务已经提交的修改结果进行了覆盖,对第二个事务造成了数据丢失。

可以看出,上述问题,均是在并发情况下发生的,并发度越高,上述出现的情况也普遍。

如何解决事务的并发问题怎么办?

为了避免上述事务并发问题的出现,标准 SQL 规范定义了四种事务隔离级别,不同的隔离级别对事务的处理有所不同。这四种事务的隔离级别如下:

四 、数据库事务的四种隔离级别

mysql数据库测试,首先创建一个表accoun,然后往表中插入两条数据,插入后结果如下:

为了说明问题,我们打开两个控制台分别进行登录来模拟两个用户(暂且成为用户A和用户B吧),并设置当前MySQL会话的事务隔离级别。

1)Read Uncommitted(读取未提交数据

一个事务在执行过程中,既读取其他事务未提交的数据,又可以读取本事务未提交的修改数据。一个事务已经开始写数据,则另外一个事务不允许同时进行写操作,但允许其他事务读此行数据。此隔离级别可防止丢失更新

缺点:

能读取到其他事务修改未提交的数据,会产生“脏读”

读未提交是并发最高,但一致性也最差的隔离级别。

具体用户A的操作如下:

set session transaction isolation level read uncommitted;
start transaction;
select * from account;

用户B的操作如下:

set session transaction isolation level read uncommitted;
start transaction;
update account set account=account+200 where id = 1;

 随后我们在A用户中查询数据,结果如下:

结论:
我们将事务隔离级别设置为read uncommitted,即便是事务没有commit,但是我们仍然能读到未提交的数据,这是所有隔离级别中最低的一种。
那么这么做有什么问题吗?

那就是我们在一个事务中可以随随便便读取到其他事务未提交的数据,这还是比较麻烦的,我们叫脏读。我不知道这个名字是怎么起的,为了增强大家的印象,可以这么想,这个事务好轻浮啊,饥渴到连别人没提交的东西都等不及,真脏,呸!

实际上我们的数据改变了吗?

答案是否定的,因为只有事务commit后才会更新到数据库。

 2)Read Committed(读已提交)---大多数数据库默认的隔离级别

优点:此隔离级别可有效防止脏读

在该隔离级别下,不允许2个未提交的事务之间并行执行,但它允许在一个事务执行的过程中,另外一个事务得到执行并提交。读取数据的一个事务不会禁止其他写事务,读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。

缺点:此隔离级别会产生不可重复读问题。

该方式是oracle数据库默认的隔离级别,事务提交需手动进行。

注意,在互联网大数据量,高并发量的场景下,几乎不会使用上述两种隔离级别。

在用户A所在的会话中我们执行下面操作: 

set session transaction isolation level read committed;
start transaction;
update account set account=account-200 where id=1;

在B用户所在的会话中查询:

select * from account;

结果如下:

我们会发现数据并没有变,还是1000。

接着在会话A中我们将事务提交:

commit;

 在会话B中查询结果如下:

结论: 

当我们将当前会话的隔离级别设置为read committed的时候,当前会话只能读取到其他事务提交的数据,未提交的数据读不到。
那么这么做有什么问题吗?

那就是我们在会话B同一个事务中,读取到两次不同的结果。这就造成了不可重复读,就是两次读取的结果不同。这种现象叫不可重复读。

 3)Repeatable Read(可重复读)

这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。

但是不能解决幻读,为啥?看个场景

可重复读取隔离级别下,因为只是对一个事务写操作的行加了行锁,但依旧允许别的事务在该表其他行插入和删除数据,于是就会出现,在事务1执行的过程中,如果先后两次select出符合某个条件的行,如果在这两次select之间另一个事务得到了执行,insert或delete了某些行,就会出现先后两次select出来的符合同一个条件的结果不一样,第一次select好像出现了幻觉一样,因此,这个问题也被成为幻读。要想解决幻读问题,需要将数据库的隔离级别设置为串行化。

4)Serializable(可串行化)

这是最高的隔离级别,它强制事务都是串行执行的,使之不可能相互冲突,从而解决幻读问题。换言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。

介绍完四种隔离级别,这里小结下:

总结:

1.四种隔离级别最高的是 Serializable 级别,最低的是 Read uncommitted 级别,当然级别越高,执行效率就越低。像 Serializable 这样的级别,就是以 锁表 的方式(类似于Java多线程中的锁)使得其他的线程只能在锁外等待,所以平时选用何种隔离级别应该根据实际情况。在MySQL数据库中默认的隔离级别为Repeatable read (可重复读) ;

2.在MySQL数据库中(只有InnoDB支持事务),支持上面四种隔离级别,默认的为Repeatable read (可重复读) ;而在 Oracle数据库 中,只支持Serializable (串行化) 级别和 Read committed (读已提交) 这两种级别,其中默认的为 Read committed(读已提交) 级别;

3.通常来说,事务的隔离级别越高,越能保证数据库的完整性和一致性,但相对来说,隔离级别越高,对并发性能的影响也越大。因此,Oracle通常将数据库的隔离级别设置为 Read Committed,即读已提交数据,它既能防止脏读,又能有较好的并发性能。虽然这种隔离级别会导致不可重复读、幻读和第二类丢失更新这些并发问题,但可通过在应用程序中采用悲观锁和乐观锁加以控制;

五、各种数据库的默认隔离级别

5.1MySQL

mysql默认的事务处理级别是'REPEATABLE-READ',也就是可重复读

1.查看当前会话隔离级别

select @@tx_isolation;

2.查看系统当前隔离级别

select @@global.tx_isolation;

3.设置当前会话隔离级别

set session transaction isolatin level repeatable read;

4.设置系统当前隔离级别

set global transaction isolation level repeatable read;

5.2Oracle

oracle数据库支持READ COMMITTED 和 SERIALIZABLE这两种事务隔离级别。

默认系统事务隔离级别是READ COMMITTED,也就是读已提交

1.查看系统默认事务隔离级别,也是当前会话隔离级别

--首先创建一个事务
declare
     trans_id Varchar2(100);
  begin
     trans_id := dbms_transaction.local_transaction_id( TRUE );
  end; 

--查看事务隔离级别

SELECT s.sid, s.serial#,

  CASE BITAND(t.flag, POWER(2, 28))
    WHEN 0 THEN 'READ COMMITTED'
    ELSE 'SERIALIZABLE'
  END AS isolation_level
FROM v$transaction t
JOIN v$session s ON t.addr = s.taddr AND s.sid = sys_context('USERENV', 'SID');

5.3SQL Server

默认系统事务隔离级别是read committed,也就是读已提交

1.查看系统当前隔离级别

DBCC USEROPTIONS 

isolation level 这一项的 Value 既是当前的隔离级别设置值

2.设置系统当前隔离级别

SET TRANSACTION ISOLATION LEVEL Read UnCommitted;

其中Read UnCommitted为需要设置的值

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用AI动作捕捉制作动画图像——Viggle AI教程

使用AI动作捕捉制作动画图像——Viggle AI教程 在数字媒体时代,动画制作已经成为一种流行的艺术形式。最近,我在网上发现了一个非常有趣的AI动画制作工具——Viggle AI。这个工具不仅简单易用,而且目前还是免费的。在这篇博客中,我…

DHCP小实验

实验要求: 看拓扑有两个网段则我们首先需要对200.1.1.0/26进行子网划分,划分为两个子网,为200.1.1.0/27和200.1.1.32/27 我门就可以一边一个网段了,左边为200.1.1.0/27,右边为200.1.1.32/27 1、配置PC1,2…

腾讯EdgeOne产品测评体验——不仅仅是加速,更是您数字安全的坚实盾牌!

EdgeOne 是什么--- 下一代CDN 腾讯云推出的边缘安全加速平台 EO(Tencent cloud EdgeOne,下文简称为 EdgeOne) 是基于腾讯边缘计算节点提供加速和安全的解决方案。即对标传统的 CDN 网络分发节点,但是其在加速和安全防护的方面有更…

从建表语句带你学习doris_表索引

1、doris建表概述 1.1、doris建表模板 CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [DATABASE.]table_name (column_definition1[,column_deinition2,......][,index_definition1,[,index_definition2,]] ) [ENGINE [olap|mysql|broker|hive]] [key_desc] [COMMENT "tabl…

无人零售行业展望:智能化与便利性引领未来

无人零售行业展望:智能化与便利性引领未来 无人零售,这一依靠智能化技术如人工智能、物联网、和大数据的零售模式,正逐步成为全球零售行业的新趋势。该模式允许消费者在没有店员的情况下自助完成购物,提供了24小时服务&#xff0…

Redis集群机制及一个Redis架构演进实例

Replication(主从复制) Redis的replication机制允许slave从master那里通过网络传输拷贝到完整的数据备份,从而达到主从机制。为了实现主从复制,我们准备三个redis服务,依次命名为master,slave1&#xff0c…

季节更迭 关爱不变 | 鲁南制药四季守护您的健康生活

春天,万物复苏的季节,一切都充满了生机和活力。在春日的阳光下,鲜花盛开,绿叶茂盛,鸟儿欢歌,蝴蝶翩翩起舞。我们的身体也需要特别的关爱和养护,保持健康和活力,更好地迎接每一次季节…

MySQL 实例employee表综合查询

目录 表关系图: 例题: 1.查出至少有一个员工的部门。显示部门编号、部门名称、部门位置、部门人数。 2.列出所有员工的姓名及其直接上级的姓名。 3.列出受雇日期早于直接上级的所有员工的编号、姓名、部门名称。 4.列出部门名称和这些部门的员工信…

正五边形C语言绘制方法

正五边形C语言绘制方法 平面几何大家都学过,基本的概念就是点、线、面,三角形、矩形、圆形和椭圆形,还有就是多边形。学几何时都强调用圆规直尺三角板作图,学到角度就用到量角尺。那时我对五角星,六角星很感兴趣。后来…

【攻防世界】lottery

弱比较代码审计 本题已提供源码,如果没提供,输入/robots.txt,发现/.git function buy($req){require_registered();require_min_money(2);$money $_SESSION[money];//接受用户原有money$numbers $req[numbers];//接受输入的数字$win_num…

生产者消费者模型之环形队列

引入 以电影院买票为例 去电影院看电影需要先买票,如果买过票了,哪怕我们没有去看电影,在电影票的有效期内,电影院对应的座位就是属于你的。 买票的本质:对资源(座位)的预订。 信号量 本质…

【VUE】Vue项目打包报告生成:让性能优化触手可及

Vue项目打包报告生成:让性能优化触手可及 Vue.js是一款流行的前端框架,开发者在使用Vue.js构建项目时,生产环境的性能优化尤为重要。为了帮助开发者分析和优化打包出来的资源,生成打包报告是一个不可或缺的步骤。本文将介绍几种在…

光纤收发器的注意事项

光纤收发器有各种不同的类别,而实际使用中最受关注的是根据光纤收发器的不同类别:SC连接器光纤收发器和FC/ST连接器光纤收发器。 当使用光纤收发器连接到不同的设备时,必须小心使用不同的端口。 1.光纤收发器与100Base TX设备(交…

RAKsmart:硅谷裸机云多IP服务器性能评测

在云计算领域,裸机云作为一种结合了传统物理服务器与云计算优势的服务模式,近年来备受关注。硅谷裸机云作为业界佼佼者,以其出色的性能和稳定性赢得了众多用户的青睐。今天,我们就来评测一下硅谷裸机云的多IP服务器性能。 首先&am…

JVM基础第二篇

目录 垃圾回收 如何判断对象可以回收 引用计数法 可达性分析算法 定义 哪些对象可以作为GC roots? 四种引用 1.强引用 2.软引用(SoftReference) 3. 弱引用(WeakReference) 4. 虚引用(PhantomRefe…

OpenHarmony轻量系统开发【6】驱动之ADC按键

摘要:本文简单介绍如何操作ADC去读取电压,并且实现开发板上3个ADC按键检测的功能 适合群体:适用于润和Hi3861开发板,L0轻量系统驱动开发 文中所有代码仓库:https://gitee.com/qidiyun/hihope-3861-smart-home-kit 6…

FL Studio v21.2.3.4004 中文永久版网盘下载(含Key.reg注册表补丁)

软件介绍 FL Studio21水果编曲软件汉化版是一款专业的音乐制作软件,被广泛地应用于电子音乐、hip-hop、流行乐等多种音乐类型的制作。该软件提供了丰富的音频编曲工具和音乐效果器,让用户可以轻松地创作出高品质的音乐作品。同时,这也是一款…

在比特币中,1 sat 是多少美元?

普通人绝对想不到,比特币能在2024年达到这个价值,早知道的话,我当初就是破釜沉舟也得买一个啊。 而在4月19号,也将迎来比特币再次减半。减半并不是说玩家手中的比特币要被突然减去一半,而是在后续的挖矿过程中&#xf…

[Algorithm][双指针][复写零][快乐数][盛水最多的容器][有效三角形的个数]详细解读 + 代码实现

目录 1.复写零1.题目链接2.算法原理讲解3.代码实现 2.快乐数1.题目链接2.算法原理讲解3.代码实现 3.盛水最多的容器1.题目链接2.算法原理讲解3.代码实现 4.有效三角形的个数1.题目链接2.算法原理讲解3.代码实现 1.复写零 1.题目链接 题目链接 2.算法原理讲解 先找到最后一个…

洁净室空气颗粒物检测-激光尘埃粒子计数器如何选型 北京中邦兴业

空气颗粒是通过迫使空气通过颗粒计数器中的空腔来测量的,该计数器使用激光来测量和计数颗粒。这是通过一个称为光散射的过程来实现的。 粒子计数器的部件 在粒子计数器内,你会发现一个激光传感器块。这就是使用光散射原理来确定粒子大小和数量的地方。…