oracle 数据库隔离级别

oracle 数据库隔离级别[b]事务不同引发的状况:[/b]脏读(Dirtyreads)一个事务读取另一个事务尚未提交的修改时,产生脏读很多数据库允许脏读以避免排它锁的竞争。不可重复读(Nonrepeatablereads)同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发…

大家好,又见面了,我是你们的朋友全栈君。[b]事务不同引发的状况:[/b]

脏读(Dirty reads)

一个事务读取另一个事务尚未提交的修改时,产生脏读

很多数据库允许脏读以避免排它锁的竞争。

不可重复读(Nonrepeatable reads)

同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生非重复读。

幻读(Phantom reads)

同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻像读。

[b]数据库操作的隔离级别[/b]

未提交读(read uncommitted)

提交读(read committed)

重复读(repeatable read)

序列化(serializable)

[b]oracle默认隔离级别[/b]read committed (statement level serialization)

每一个语句,在语句开始时,会获取一个此刻的数据快照。

一个事务有多条语句,如果语句之间存在其它完成的事务,

这可能引起不可持续读和幻读。

新建一个测试表books:

name,code,price三个字段

添加两条测试数据

[img]http://dl2.iteye.com/upload/attachment/0096/6188/19e41b31-81f9-3a08-bd58-e047843614d5.jpg[/img]

使用pl/sql和java程序模拟并发

[i]不允许脏读测试:[/i]

程序段首先查询code是qqq的书的价格


//获取连接 省略
pstat = conn.prepareStatement("select price from books where code='qqq'");
rs = pstat.executeQuery();
while(rs.next()){
System.out.println("price:"+rs.getDouble(1));
}
close();

输出结果:price:15.0

然后pl/sql执行更新

update books set price=18 where code='qqq';

[color=orange]!pl/sql设置成手动更新,不自动更新[/color]

在执行上面java查询代码

输出仍是price:15.0,说明读不到pl/sql中未提交的执行结果,即不允许脏读

pl/sql 执行

commit;

在执行java查询:

输出结果:price:18.0

会有不可重复读何幻读的现象发生就不用测试了吧,

这两种现象都是针对提交后事物的读引起的,read commited隔离级别是允许对提交后

的事物进行读的。

[i]隔离级别:重复读(repeatable read)[/i]

这个不允许脏读,不可重复读,但是会有幻读现象。

这个oracle不支持,不好测试。

理解的话就是如果一条查询语句查询的内容有其它事物正在更新的时候,这

查询处于等待状态,直到先前事物提交更新后,才会执行本条查询。也就是

查询的时候也会有锁,需要等待并发的事物释放锁。然后自己获取到锁,执行

自己事物。这样查询也加锁,并发性更低

select … for update 就是这样可以避免不可重复读的发生

[i]隔离级别:serializable [/i]

这个就更严格了,事物执行是一个一个的。一个事务中的语句共享同一个数据快照(在事务开始时存在的数据)。

是事物级别的,脏读,不可重复读,幻读根本就没有机会发生。

前面像read committed都是语句级别的,以语句为单元。

比如

read committed一个事物A有a(select),b(select),c(update)三条语句

当A事物执行a,b的时候,若有B事物执行更新操作,是有可能的

因为a,b是不加锁的

写个例子:

			//获取连接和关闭连接代码 省略
//不自动提交
conn.setAutoCommit(false);
/**
* a 查询
*/
pstat = conn.prepareStatement("select price from books where code='qqq'");
rs = pstat.executeQuery();
while(rs.next()){
//输出 price:25.0
System.out.println("price:"+rs.getDouble(1));
}
close();

/**
* 暂停一会,用pl/sql执行B事务
* update books set price=15 where code='qqq';
* commit;
*/
Thread.sleep(10000);

/**
* 如果这里再执行a查询的话,和第一次查询结果就不一样,因为中间有B事务的提交更新
* 修改,这也是不可重复读
*/

//b 更新
pstat = conn.prepareStatement("update books set price=price+10 where code='qqq'");
pstat.executeUpdate();
close();
//c 查询
pstat = conn.prepareStatement("select price from books where code='qqq'");
rs = pstat.executeQuery();
while(rs.next()){
//输出 还是price:25.0 ,因为B事务的干预
System.out.println("price:"+rs.getDouble(1));
}
close();
//提交事务
conn.commit();
if(conn != null){
conn.close();
}

上面执行的顺序,

事务B是在A的执行过程中执行的

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

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/141148.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • WineQQ_wine官网

    WineQQ_wine官网https://phpcj.org/wineqq/(转发备注:实测可用,安装完后把windows下的字体拷贝到/home/xxx/.wine/drive_c/windows/Fonts即可无乱码,作者持续更新,可关注上面的原链接)最后更新日期:2018年5月5日[20180505]1、QQ升级为小俊的9.0.3_23719。[20180420]1、QQ升级为小俊的9.0.2_23475。[2018…

    2025年9月22日
    7
  • arcgis runtime for android 100.13.0 入门系列,一、初步引入与运行

    arcgis runtime for android 100.13.0 入门系列,一、初步引入与运行这是我来到csdn以来写的第一篇文章,希望能通过文字能把我的学习经过与心得分享给大家。我使用的是Kotlin来编写代码,我将默认各位具有一定的Android编程基础。言归正传,我们接下来要做的第一件事情就是使用AndroidStudio来创建一个空的新项目了我接下来的操作都是遵循arcgisandroid官方进行搭建的,读者看到的时候可能已经出了新的版本了,不过应该是小版本,arcgisandroid主体代码结构应该是不会变的,请放心阅读与搭建欢迎加入我们的QQ交流群249819194.

    2022年7月17日
    15
  • 弗曼学习法,你在用吗?

    弗曼学习法,你在用吗?今天简单的谈论一下弗曼学习法,是被学术界认为最niubi的学习方法。理查德.弗曼(1918-1988)1965年获得诺贝尔物理学奖,美籍犹太人,也是最早提出纳米的人。之所以以他的名字命名改学习方法,想必不用说大家也都知道了,总之很厉害一个人就是了。 弗曼学习法的原理,可以用一句话来概括(透过现象看本质),比方说我们刚学习、接触一个知识点,按照正常的逻辑就是去学会怎么使用它就行了,而带来的弊端就是,当时,亦或者一段时间内我们能记得,但是随着时间加长,没有使用过这个知识点,我们便会很快就忘记了。因为我

    2022年6月13日
    40
  • mac phpstorm激活码2021【在线注册码/序列号/破解码】[通俗易懂]

    mac phpstorm激活码2021【在线注册码/序列号/破解码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月18日
    41
  • idea2021.01.激活码【在线注册码/序列号/破解码】

    idea2021.01.激活码【在线注册码/序列号/破解码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月20日
    66
  • php三个数从大到小排列_单分支if语句和双分支

    php三个数从大到小排列_单分支if语句和双分支<?php$a = rand(100,999);$b = rand(100,999);$c = rand(100,999);echo “a=”.”$a”.”<br>”;echo “b=”.”$b”.”<br>”;echo “c=”.”$c”.”<br>”;if(($a > $b ) && ($a > …

    2022年8月18日
    12

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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