oracle事务隔离级别_mysql查看事务隔离级别

oracle事务隔离级别_mysql查看事务隔离级别Oracle事务隔离级别

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

先看一张Concepts中关于事务隔离级别的一张表格:

oracle事务隔离级别_mysql查看事务隔离级别

从上图可以看到:

通常事务的隔离级别定义为以下4种(基于3种在并发事务中需要避免的现象来划分的):

1.Read uncommitted
        从字面意义可以看出,读取那些未提交的数据。事务1在事务进行过程中,会读到事务2修改了但是没有提交的数据,所以产生了 脏读(Dirty Read)。

2.Read committed
        读取提交的数据。事务1在事务开始后第1次查询了emp_id=1的emp_name=sean,然后事务2修改了emp_id=1的emp_name=king并提交,接着事务1第2次查询emp_id=1的emp_name=king。可见在事务1的整个过程中,2次查询同一条数据获得了不同的结果,因为只要提交的数据就能被看到。所以这种隔离级别不能避免 不可重复读(Nonrepeatable Read)。

3.Repeatable read
        字面意思是可以重复读,比照上例,就是在事务1的整个过程中,查询某一条数据总能获得相同的结果。但是不能避免 幻读(Phantom Read)。什么是幻读,和 不可重复读 的区别在哪里?想象这种情形,事务1第1次统计dept_id=20的员工总数为50,此时事务2往员工表插入1条新的员工记录并提交,事务1第2次查询dept_id=20的员工总数为51.发现2次统计的结果不一致。这种情况称之为 幻读。与 不可重复读的区别是,在此类场景中,事务1第1次读取的数据并没有被修改。而是新增了数据导致满足条件的数据发生了变化。所以 幻读 和 不可重复读 的区别就在于事务读取的数据是否发生了变化。

4.Serializable
        字面意思是串行化。在串行化隔离级别的时候,事务看到的都是事务开始那一刻的数据。举例说明。现在员工表中dept_id=20的员工总数为50。事务1开始后,第1次查询dept_id=20的员工总数为50,接着事务2删除了1条dept_id=20的员工并提交,事务1第2次查询dept_id=20的员工总数仍然为50(如果事务1隔离级别是2.Read committed,此时结果就会是49),接着事务3增加了2条dept_id=20的员工并提交,事务1第3次查询dept_id=20的员工总数仍然为50(如果事务1隔离级别是3.Repeatable read,此时看到的结果是52,删除属于数据发生了变化,所以不可见,但是新增2条记录可见)。串行化可以这么理解,就是任何一个事务都觉得数据库就他一个事务在串行执行,没有其他事务和他并行执行,没有其他事务,他看到的数据当然不会发生变化。

以上大致介绍了基于3种需要避免的现象而划分出的4种隔离级别。
Oracle支持 Read committed(默认) 和 Serializable 以及 Read only(数据库只读打开,和Serializable很像,但是禁止数据修改除非是sys用户)。
随着隔离级别的提高,数据库对于事务并发的支持能力会下降。对于Oracle默认情况下不能避免的 不可重复读 和 幻读 现象。在应用设计阶段应该考虑到。

下面演示几种场景:

--准备测试数据

SQL> drop table t purge;

SQL> create table t (id int);

SQL> insert into  t values(1);

SQL> insert into  t values(2);

SQL> insert into  t values(3);

SQL> commit;

SQL> select * from t;

        ID
----------
         1
         2
         3


--演示1、Read committed(默认隔离级别)演示,所有以下操作按时间顺序

--事务1 手动开启一个事务
SQL> set transaction isolation level read committed;

--事务1 查询表中数据
SQL> select * from t;

        ID
----------
         1
         2
         3

--事务2 删除一条数据并提交
SQL> delete from t where id=3;
SQL> commit;

--事务1 第2次查询表中数据,发现和第1次读取结果不一致,这就是 不可重复读 现象。
SQL> select * from t;

        ID
----------
         1
         2





--演示2、Serializable(隔离级别)演示,所有以下操作按时间顺序

--事务1 手动开启一个事务
SQL> set transaction isolation level Serializable;

SQL> select * from t;

        ID
----------
         1
         2

--事务2 增加2条数据并提交
SQL> insert into t select * from t;
SQL> select * from t;

        ID
----------
         1
         2
         1
         2

SQL> commit;

--事务1 再次查询表中数据,仍然只有2条数据,因为事务1在事务2之前开始,所以事务1只能看到的是事务开始那个时间的数据,其他都不可见
SQL> select * from t;

        ID
----------
         1
         2





--演示3、ORA-08177: can't serialize access for this transaction

--目前表中数据
SQL> select * from t;

        ID
----------
         1
         2
         3


--事务1 手动开启一个事务
SQL> set transaction isolation level Serializable;

--事务2 修改1条数据先不提交
SQL> update t set t.id=4 where id=3;
1 row updated.

--事务1 修改同一条数据
SQL> update t set t.id=4 where id=3;
事务被hang住了

--事务2 提交刚刚的修改
SQL> commit;
Commit complete.

--事务1 产生报错信息,我们知道事务1先于事务2开启,事务1开启时,表中是存在id=3这条记录的。当事务2修改这条记录并提交。
--事务1再去修改这条记录发现这条记录发生了改变导致修改失败。由此可见串行化的隔离级别并发性会大打折扣。
--前面我们说过,串行化就是事务觉得数据库里面就他一个人在做操作,当他要修改一个数据发现在事务开始后被别人修改了,就会报错。
SQL> update t set t.id=4 where id=3;
update t set t.id=4 where id=3
*
ERROR at line 1:
ORA-08177: can't serialize access for this transaction




Oracle®Database
Concepts
12c Release 1 (12.1)
E41396-14

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/182134.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • java是面向对象还是面向过程_面向对象和面向过程最本质的区别是什么?

    java是面向对象还是面向过程_面向对象和面向过程最本质的区别是什么?面向对象和面向过程最本质的区别在于考虑问题的出发点不同,面向过程是以事件流程为考虑问题的出发点,而面向对象则是以参与事件的角色(对象)为考虑问题的出发点,所以面向对象在处理问题时更加灵活。目前,面向过程的语言更多被用于处理底层业务,而面向对象编程则更多用于实现一些业务逻辑复杂的大型系统。从结构上来说,面向过程的特点是模块化和流程化,而面向对象的特点是封装、继承和多态,这里面就有本质的区别了。面向过…

  • netty权威指南第二版源码 百度云_dubbo源码视频

    netty权威指南第二版源码 百度云_dubbo源码视频netty权威指南第二版源码 https://github.com/wuyinxian124/nettybook2

  • ECharts介绍及使用方法

    ECharts介绍及使用方法前面做项目时用到ECharts,今天特此整理一下,作为笔记,同时希望帮助更多人。首先简单介绍一下,ECharts是一个纯JavaScript图表库,底层依赖于轻量级的Canvas类库ZRender,基于BSD开原协议,是一款非常优秀的可视化前端框架。官网地址:http://echarts.baidu.com/1.首先在官网选择合适的下载版本http://echart…

  • @RequestMapping和@GetMapping @PostMapping 区别

        最近学习看一些代码,发现对于发送请求这件事,有的地方用@RequestMapping,有的地方用@PostMapping,为了搞清楚区别,特意查了下spring源代码,现在特此记录下。 @GetMapping用于将HTTPget请求映射到特定处理程序的方法注解具体来说,@GetMapping是一个组合注解,是@RequestMapping(method=RequestM…

  • Java封装详解,很简单

    Java封装详解,很简单大家好,今天来给大家分享一下Java封装面向对象有三大特征:1.封装2.继承3.多态我们来讲Java封装,它也是Java面向对象的三大特征之一封装,大白话的解释就是,把一个东西,装到箱子了,只留小小的口,用于外界访问画一个图就是该露的露,该藏的藏我们在程序设计的过程中要追求“高内聚,低耦合”。高内聚就是类的内部数据操作细节自己来完成,不允许外部干涉,低耦合:就是,仅暴露少量的方法给外部使用封装(数据的隐藏)通常,应禁止直接访问一个对象中数据的实际表示,而是应该通过操作接口来访问

  • 签名字体怎么练_练字方法练自己名字签字

    签名字体怎么练_练字方法练自己名字签字导读:今天来给大家分享【签名字体怎么练】技法来源于网络,只是分享学习一下。感谢大家的支持,如果,你在签名字体上有什么不懂的可以来询问我的。谢谢大家的浏览!签名字体怎么练1、签名也是字体造型的再创作,因此签名设计对一个人的书法水平和理解能力还是有一定要求的。在此,我建议大家可以先练习好楷书和行书。如果真的没那个天分,就好好练习数字1.2.3.4.5.6.7.8.9。为什么练习数字可以对设计签名有帮助呢,因为数字和汉字笔画在书写方面具有一定的相似性,可以借鉴。同时帮助您练顺运笔。2、要想设计好签名,就要

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号