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

简介: 5、一致性读和当前读的深入理解: 在CSDN里经常会遇到一些特别有学习劲头的朋友,有这样一个朋友,在学习Tom的经典书  《oracle 9i/10g编程艺术》 人民邮电出版的  P244 --7.

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
相关文章
|
SQL 人工智能 Oracle
NineData支持全版本的企业级Oracle客户端,现已发布!
Oracle数据库是一款全球领先的关系型数据库管理系统,NineData发布对Oracle数据库的SQL开发支持。开发者可以使用NineData便捷查询云端、本地、多个版本的Oracle数据库。NineData在近期的迭代中提供了对Oracle数据库的支持。具有可视化工具、AI智能优化、SQL智能提示、企业协同等多种强大能力,并且无需安装,登录即可使用,同时在安全性上也为您提供了相当可靠的保障。
403 0
NineData支持全版本的企业级Oracle客户端,现已发布!
|
13天前
|
SQL Oracle 安全
免费 Oracle 各版本 离线帮助使用和介绍
免费 Oracle 各版本 离线帮助使用和介绍
17 2
|
6月前
|
DataWorks Oracle 关系型数据库
DataWorks操作报错合集之尝试从Oracle数据库同步数据到TDSQL的PG版本,并遇到了与RAW字段相关的语法错误,该怎么处理
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
87 0
|
6月前
|
SQL Oracle 关系型数据库
【ORACLE】 事务 | 锁 | 约束 | 权限、角色与用户管理
【ORACLE】 事务 | 锁 | 约束 | 权限、角色与用户管理
64 1
|
6月前
|
SQL Oracle 安全
Oracle数据库中的事务和锁
【4月更文挑战第19天】Oracle数据库的事务和锁是确保数据完整性和并发控制的核心机制。事务遵循ACID原则,保证操作的原子性、一致性、隔离性和持久性。通过COMMIT或ROLLBACK来管理事务更改。锁包括共享锁(读)、排他锁(写)、行级锁和表级锁,用于控制并发访问。自动锁机制在DML操作时生效,防止数据冲突。事务和锁共同维护数据库的稳定和安全。
|
6月前
|
Oracle 关系型数据库 Linux
RHEL7.9系统下一键脚本安装Oracle 11gR2单机版本
RHEL7.9系统下一键脚本安装Oracle 11gR2单机版本
286 1
|
6月前
|
SQL Oracle 关系型数据库
Oracle-锁解读
Oracle-锁解读
95 0
|
Oracle 关系型数据库 Linux
oracle学习82-VMware出现配置文件 .vmx 是由VMware产品创建,但该产品与此版 VMware workstation 不兼容,因此无法使用(VMware版本不兼容问题)
oracle学习82-VMware出现配置文件 .vmx 是由VMware产品创建,但该产品与此版 VMware workstation 不兼容,因此无法使用(VMware版本不兼容问题)
645 0
oracle学习82-VMware出现配置文件 .vmx 是由VMware产品创建,但该产品与此版 VMware workstation 不兼容,因此无法使用(VMware版本不兼容问题)
|
SQL Oracle 关系型数据库
Polar DB-O (兼容 Oracle 语法版本)和Polar DB PostgreSQL 版本概述(二)
Polar DB-O (兼容 Oracle 语法版本)和Polar DB PostgreSQL 版本概述(二)
1655 0
|
JSON Oracle 关系型数据库
Oracle 数据库目前版本和支持策略综述
Oracle 数据库的 Long Term 版本和 Innovation 版本
689 0