oracle锁机制的延续——并发与多版本2

5、一致性读和当前读的深入理解:

在CSDN里经常会遇到一些特别有学习劲头的朋友,有这样一个朋友,在学习Tom的经典书 

《oracle 9i/10g编程艺术》 人民邮电出版的 
P244 --7.4 写一致 

在一致性读 这里遇到些困惑,如下

引用:

create table t ( x int, y int ); 
insert into t values ( 1, 1 ); 
commit; 
create or replace trigger t_bufer 
before update on t for each row 
begin 
dbms_output.put_line 
( 'old.x = ' || : old.x || 
', old.y = ' || : old.y ); 
dbms_output.put_line 
( 'new.x = ' || :new.x || 
', new.y = ' || :new.y ); 
end; 

上面是观察重启动更新触发器 

sql1 : UPDATE t SET x = 2 WHERE y = 5; 

如果 在更新sql1时,别的会话也在更新这条记录并且把y=5更新也了 y=10 
这样oracle 会选择重启动更新,但重启动更新还是有可能会遇到同样的问题

这是一个非常经典的一段描述一致性读和写一致性的段落 

看到这么认真的朋友,也激起了我的解答欲。 

其实在oracle里保证一致性读写的特点,我自己是通过两个小点来进行归纳的 
1. 一致读(Consistent read):“发现”要修改的行时,所完成的获取就是一致读。 
2. 当前读(Current read):得到块来实际更新所要修改的行时,所完成的获取就是当前读。 

对于query里的查询是一致性读,这时是没有脏数据的。 对于update的时候,重新启动查询,避免脏数据写。 

根据这个基本原则,我们一起来做做实验,还是先用上面的trigger,注意这里的trigger和我们这里的知识点没有必然的联系,只是为了更清楚的表现出重新查询这个动作,我们加入的一个类似log的方式。 

我们还是用上面的sql来作为例子 
不过这里关键的是执行顺序 

哪个语句在前面执行, 现在数据库里的数据如下 
Data 
X Y 
4 5 

update的语句有两条 
SQL1: UPDATE t SET x = 2 WHERE y = 5; 
SQL2: UPDATE t SET y=y+1; 

如果sql1先执行,那么后面一句sql2 因为会同样update到 y=5的记录,这是sql1还没有提交,读一致性,不会读脏数据库,所以y=5还在,因此sql2会hold住. 
我们来提交sql1.看看结果如何 
当sql1提交时,sql1执行成功, 数据更新了x=2, 对于sql2来说重启动查询。用新值更新,不过sql1来说y没有发生改变,当SQL2也更新的时候,y是在原值上+1 
这时候数据库的值为 
X->2 (SQL1作用) 
Y->Y+1 (SQL2作用) 
X Y 
2 6 
现在我们反过来,还是用刚才的数据 
先执行sql2, 然后执行sql1 看看是怎样的 

先执行sql2,由于sql1读一致性,现在脏数据没有提交,读一致性,找到y=5的一条记录,进行更新,所以sql1现在hold住了。当 sql2提及以后, 数据库更新成功y=5已经变成了6叻。 sql1会如果操作了,很简单,对于update的动作来说,重新查询,这时由于重新查询,已经找不到要更新的y=5的记录了,这样也就一条记录都不会 update。 

数据库现在的变化为 
Y->Y+1 (SQL2作用) 
X->4 (SQL1作用) y=5的记录没有叻,所以更新0条记录。 

这也就是上面2点的真实表现了。 

Oracle 处理修改语句时会完成两类块获取。它会执行: 
一致读(Consistent read):“发现”要修改的行时,所完成的获取就是一致读。 
当前读(Current read):得到块来实际更新所要修改的行时,所完成的获取就是当前读。 

对这样的知识点,是不是大家都这样认真的思考过,总结过了,其实学习就是这样的。当你激发了自己的潜能和兴趣,你会变着法思考着里面的内容 

有兴趣的朋友可以,试想一下 
这样的case将是这样的结果?

引用:

数据库数据 
X Y 
---------- ---------- 
2 5 

SQL1 
Update t set x = 4 where y = 5; 

SQL2 
Update t set y = 6 where x = 2

时间: 2024-11-03 13:11:04

oracle锁机制的延续——并发与多版本2的相关文章

oracle锁机制的延续——并发与多版本1

开发多用户数据库应用,最大的难题之一是:一方面要力争最大的并发访问,而同时还要确保每一用户 能以一致的方式读取和修改数据.力争最大的并发访问需要用锁定机制,而确保一致读和修改数据则需要一些并发控制机制.    1.并发控制:     并发控制(concurrency control)是数据库提供的函数集合,允许多个人同时访问和修改数据.锁(lock)是Oracle管理共享数据库资源并发访问并防止并发数据库事务之间"相互干涉"的核心机制之一.总结一下,Oracle使用了多种锁,包括:  

ORACLE锁机制深入理解_oracle

数据库是一个多用户使用的共享资源.当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性. 加锁是实现数据库并发控制的一个非常重要的技术.当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁.加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作. 在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Lo

理解oracle锁和闩(2)锁机制概述

锁(lock)是一种防止多个事务访问同一资源时产生破坏性的相互影响的机制.通常,高并发数据库需要利用锁机制解决数据并发访问.一致性及完整性问题. 前面提到的资源(resource)大致可以分为两类: ● 用户对象:例如表及数据行 ● 对用户透明的系统对象:例如内存中的共享数据结构.数据字典中的信息 任何 SQL 语句执行时 Oracle 都隐式地对 SQL 所需的锁进行管理,因此用户无需显式地对资源加锁.Oracle 默认采用的锁机制能尽可能地减小对数据访问的限制,在保证数据一致性的同时实现高度

MSSQL与Oracle数据库事务隔离级别与锁机制对比_oracle

一,事务的4个基本特征 Atomic(原子性): 事务中包含的操作被看做一个逻辑单元,这个逻辑单元中的操作要 么全部成功,要么全部失败. Consistency(一致性): 只有合法的数据可以被写入数据库,否则事务应该将其回滚到最初 状态. Isolation(隔离性): 事务允许多个用户对同一个数据进行并发访问,而不破坏数据的正 确性和完整性.同时,并行事务的修改必须与其他并行事务的修改 相互独立. Durability(持久性): 事务结束后,事务处理的结果必须能够得到固化. 以上属于废话

并发编程(四):也谈谈数据库的锁机制

首先声明,本次文章基本上都是从其他人的文章中或者论坛的回复中整理而来.我把我认为的关键点提取出来供自己学习.所有的引用都附在文后,在这里也就不一一表谢了. 第二个声明,我对于Internel DB并没有研究过,所使用的也是简单的写写SQL,截止到现在最多的一个经验也就是SQL的性能调优,具体点就是通过Postgresql的执行计划,来调整优化SQL语句完成在特定场景下的数据库调优.对于锁,由于数据库支持的锁机制已经能够满足平时的开发需要.因为所从事的行业并不是互联网,没有实时性高并发的应用场景,

Mysql事务,并发问题,锁机制-- 幻读、不可重复读(转)

1.什么是事务 事务是一条或多条数据库操作语句的组合,具备ACID,4个特点. 原子性:要不全部成功,要不全部撤销 隔离性:事务之间相互独立,互不干扰 一致性:数据库正确地改变状态后,数据库的一致性约束没有被破坏 持久性:事务的提交结果,将持久保存在数据库中   2.事务并发会产生什么问题 1)第一类丢失更新:在没有事务隔离的情况下,两个事务都同时更新一行数据,但是第二个事务却中途失败退出, 导致对数据的两个修改都失效了. 例如: 张三的工资为5000,事务A中获取工资为5000,事务B获取工资

Oracle数据完整性和锁机制简析_oracle

本课内容属于Oracle高级课程范畴,内容略微偏向理论性,但是与数据库程序开发和管理.优化密切相关:另外本课的部分内容在前面章节已经涉及,请注意理论联系实际. 事务 事务(Transaction)从 通讯的角度看:是用户定义的数据库操作序列,这些操作要么全做.要么全不做,是不可分割的一个工作单元.事务控制语句称为TCL,一般包括Commit和Rollback. 事务不是程序,事务和程序分属两个概念.在RDBMS中,一个事务可以有一条SQL语句.一组SQL语句或者整个程序:一个应用程序又通常包含多

深入JVM锁机制1-synchronized

[本文转载于深入JVM锁机制1-synchronized] 目前在Java中存在两种锁机制:synchronized和Lock,Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug Lea.本文并不比较synchronized与Lock孰优孰劣,只是介绍二者的实现原理.    数据同步需要依赖锁,那锁的同步又依赖谁?synchronized给出的答案是在软件层面依赖JVM,而Lock给出的方案是在硬件层面依赖特殊的CPU指令,大家可能会进一步追问:JVM底层又是如何实现

[转]深入JVM锁机制1-synchronized

转自:http://blog.csdn.net/chen77716/article/details/6618779    目前在Java中存在两种锁机制:synchronized和Lock,Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug Lea.本文并不比较synchronized与Lock孰优孰劣,只是介绍二者的实现原理.    数据同步需要依赖锁,那锁的同步又依赖谁?synchronized给出的答案是在软件层面依赖JVM,而Lock给出的方案是在硬件层面依赖