当前位置:首页 » 数据仓库 » oracle数据库思维导图
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

oracle数据库思维导图

发布时间: 2023-01-06 05:54:20

⑴ oracle 数据库导入怎么做 有图片最好 谢谢

1 建立一个新表,并规定其字段和字段长度
2 写控制文件,依照新表格式写好源数据文件
3 !退出,通过控制文件将源数据导入新表
OK
现在不方便截图,只能这么简单的描述了。。。

⑵ 数据库软件的Oracle

Oracle来历
70年代 一间名为Ampex的软件公司,正为中央情报局设计一套名叫Oracle的数据库,Ellison是程序员之一。Oracle是世界领先的信息管理软件开发商,因其复杂的关系数据库产品而闻名。Oracle数据库产品为财富排行榜上的前1000家公司所采用,许多大型网站、银行、证券、电信等都选用了Oracle系统。
1977年艾利森与女上司Robert Miner创立“软件开发实验室”(Software Development Labs),当时IBM发表“关系数据库”的论文,艾利森以此造出新数据库,名为甲骨文。
1978年公司迁往硅谷,更名为“关系式软件公司” (RSI),两年后,共有8名员工,年收入少于100万美金。最先提出“关系数据库”的IBM采用RSI的数据库。1982年再更名为甲骨文(Oracle)。
1984年三年内,先后进军加拿大、荷兰、英国、奥地利、日本、德国、瑞士、瑞典、澳大利亚、芬兰、法国、香港、挪威、西班牙。1986年上市时,年收入暴升至5500万美元,同年3月招股,集资3150万美元。1987年年收入达到 1.31 亿美元,甲骨文一年后成为世界第四大软件公司。两年内再进军墨西哥、巴西、中国、塞浦路斯、马来西亚、新加坡及新西兰。一年后,收入再升一倍至2.82亿美元。1990年甲骨文两年内挥军进入智利、希腊、韩国、葡萄牙、土耳其、委内瑞拉、台湾、比利时、阿根廷、哥伦比亚、哥斯达黎加及菲律宾等地,但是当年甲骨文的业绩首次发生亏损,市值急跌80%,艾利森首次安排资深管理人员参与经营。
1992年旗舰产品Oracle 7面世,使该公司业务重新步上轨道,年收入达到11.79亿美元。曾被视为甲骨文接班人、但后来被踼出局的Raymond Lane担任营运总监。1995年艾利森宣布PC已死,把全数产品推向互联网发展,并另组“网络计算机公司”(Network Computer),销售“网络计算机”,最终被淘汰收场。2000年科网接近尾声时,推出E-Business Suite,抢占应用产品市场,与昔日的生意伙伴构成严重利益冲突。同期微软及IBM数据技术提升,此后Oracle新增订单数目的占有率,在两年内下跌6.6%,业务倒退10%。2003年敌意收购仁科软件公司,引起业界哄动。两公司的争议新闻层出不穷。同年美国司法部落案阻止甲骨文收购。 2009年4月20日,甲骨文公司宣布将以每股9.50美元,总计74亿美金收购太阳计算机系统公司。
Oracle发展历程
Oracle在1979年的夏季发布了可用于DEC公司的PDP-11计算机上的商用ORACLE产品,这个数据库产品整合了比较完整的sql实现,其中包括子查询、连接及其他特性。但不得不说,软件不是很稳定,并缺少事务处理这样的重要功能。出于市场策略,公司宣称这是该产品的第二版,但却是实际上的第一版。之所以被命名为第2版而不是第1版,是因为Ellison认为潜在的客户更愿意购买第2个版本,而不是初始版本。(虽然这样做有些不太诚实,还是要承认这是个十分高明的技巧。还有一些公司把自己卖给客户的版本叫做1.0 ,学学1979年的ORACLE吧!)多年以后的今天,ORACLE公司声称是他们第一个提供了第一个SQL关系型数据库管理系统。
1983年3月,发布了ORACLE第三版。Miner和Scott历尽艰辛用C语言重新写就这一版本。C语言当时推出不久,用它来写ORACLE软件也是具有一定的风险的,但除此之外,别无他法。很快就证明了这样做是多么的正确:C编译器便宜而又有效,还有很好的移植性。从现在起,ORACLE产品有了一个关键的特性:[可移植性]。ORACLE第三版还推出了SQL语句和事务处理的“原子性”--SQL语句要么全部成功,要么全部失败,事务处理要么全部提交,要么全部回滚。ORACLE第3版还引入了非阻塞查询,使用存储在Before Image File中的数据来查询和回滚事务,从而避免了读锁定(read lock)的使用(虽然通过使用表级锁定限制了它的吞吐量)。同样是1983年,IBM发布了姗姗来迟的Database 2(DB2),但只可在MVS上使用。不管怎么说,ORACLE已经占取了先机。 在开发第三版还没有结束的时候,Scott离开了ORACLE。当时用C语言改写ORACLE的压力很大,无休止的软件调试终于让Scott不堪重负,选择了一走了之。把剩下的重担交给了Miner一个人。在出售了自己的4%的股票之后,Scott 后来创建了Gupta公司(现更名为Centura Software)和PointBase公司(提供百分之百纯Java嵌入式数据库),都是开发和数据库相关的产品。多年后有人问到他的4%的ORACLE股票的时候,Scott,这个曾经给ORACLE写出第一行代码的技术高手,也只能报以一笑了。如果能坚持下来,那是一笔几亿美金的财富。不过当时的Scott没有那么多的想法,他只是太累了。
1984年10月,ORACLE发布了第四版产品。产品的稳定性总算得到了得到了一定的增强,用Miner的话说,达到了“工业强度”。但是还不够令人满意,用户对产品的抱怨似乎永无休止。这一版增加了读一致性(Read Consistency),这是数据库的一个关键特性,可以确保用户在查询期间看到一致的数据。也就是说,当一个会话正在修改数据时,其他的会话将看不到该会话未提交的修改。可以看到,在ORACLE第四版之前,产品始终是不稳定的,但是ORACLE的这群销售人员,主要是Ellison,他在宣传ORACLE的时候总是要夸大其词,但他就是有能力把软件卖出去,而且,还卖得很好,不得不承认,这的确有些神奇。让我们看看1984年软件市场的情形,在数据库市场上的霸主是Asnton-Tale公司,他们的拳头产品是刚推出不久的dBase III(确切的说dBase是PC上的数据库软件霸主),刚刚成为全球第三大的独立软件公司(第一和第二分别是微软、Lotus,ORACLE在当时还排不上号),这一年,也是苹果公司Macintosh诞生的年度,Steven Jobs用这个拳头产品挑战老大哥IBM。同样在这一年中,ORACLE公司的开发人员刚刚把产品移植到PC上。这是最好的年代,也是最坏的年代。数以千计的小公司在软件领域里争斗不休,新公司如雨后春笋般成立,ORACLE如何才能于不败之地?
在1985年,ORACLE发布了5.0版。有用户说,这个版本算得上是ORACLE数据库的稳定版本。这也是首批可以在Client/Server模式下运行的的RDBMS产品,在技术趋势上,ORACLE数据库始终没有落后。这意味着运行在桌面PC机(客户机)上的商务应用程序能够通过网络访问数据库服务器。1986年发布的5.1版还支持分布式查询,允许通过一次性查询访问存储在多个位置的数据。
1988年发布第6版,由于过去的版本在性能上屡受诟病,Miner带领着工程师对数据库核心进行了重新的改写。引入了行级锁(row-level locking)这个重要的特性,也就是说,执行写入的事务处理只锁定受影响的行,而不是整个表。这个版本引入了还算不上完善的PL/SQL(Proceral Language extension to SQL)语言。第6版还引入了联机热备份功能,使数据库能够在使用过程中创建联机的备份,这极大地增强了可用性。同时在这一年,ORACLE开始研发ERP软件。
1997年,Oracle推出了面向网络计算的数据库Oracle8
1999年,Oracle正式提供世界上第一个Internet数据库Oracle8i。
2001年6月,Oracle又推出了新一代Internet电子商务基础架构Oracle9i。
2004年,Oracle发布oralce10g。
2007年7月12日,甲骨文公司在美国纽约宣布推出数据库Oracle 11g,。
2013年7月8日,最新一代的全球领先的数据库Oracle Database 12c全面上市,这是Oracle数据库的最新版本。

⑶ Oracle系统的结构

ORACLE数据库系统为具有管理ORACLE数据库功能的计算机系统。每一个运行的ORACLE数据库与一个ORACLE实例(INSTANCE)相联系。一个ORACLE实例为存取和控制一数据库的软件机制。每一次在数据库服务器上启动一数据库时,称为系统全局区(SYSTEM GLOBAL AREA)的一内存区(简称SGA)被分配,有一个或多个ORACLE进程被启动。该SGA 和 ORACLE进程的结合称为一个ORACLE数据库实例。一个实例的SGA和进程为管理数据库数据、为该数据库一个或多个用户服务而工作。
在ORACLE系统中,首先是实例启动,然后由实例装配(MOUNT)一数据库。在松耦合系统中,在具有ORACLE PARALLEL SERVER 选项时,单个数据库可被多个实例装配,即多个实例共享同一物理数据库。
进程结构和内存结构
进程是操作系统中的一种机制,它可执行一系列的操作步。进程是由多个线程组成的。在有些操作系统中使用作业(JOB)或任务(TASK)的术语。一个进程通常有它自己的专用存储区。ORACLE进程的体系结构设计使性能最大。
ORACLE实例有两种类型:单进程实例和多进程实例。
单进程ORACLE(又称单用户ORACLE)是一种数据库系统,一个进程执行全部ORACLE代码。由于ORACLE部分和客户应用程序不能分别以进程执行,所以ORACLE的代码和用户的数据库应用是单个进程执行。
在单进程环境下的ORACLE 实例,仅允许一个用户可存取。例如在MS-DOS上运行ORACLE 。
多进程ORACLE实例(又称多用户ORACLE)使用多个进程来执行ORACLE的不同部分,对于每一个连接的用户都有一个进程。
在多进程系统中,进程分为两类:用户进程和ORACLE进程。当一用户运行一应用程序,如PRO*C程序或一个ORACLE工具(如SQL*PLUS),为用户运行的应用建立一个用户进程。ORACLE进程又分为两类:服务器进程和后台进程。服务器进程用于处理连接到该实例的用户进程的请求。当应用和ORACELE是在同一台机器上运行,而不再通过网络,一般将用户进程和它相应的服务器进程组合成单个的进程,可降低系统开销。然而,当应用和ORACLE运行在不同的机器上时,用户进程经过一个分离服务器进程与ORACLE通信。它可执行下列任务:
对应用所发出的SQL语句进行语法分析和执行。
从磁盘(数据文件)中读入必要的数据块到SGA的共享数据库缓冲区(该块不在缓冲区时),将结果返回给应用程序处理。
系统为了使性能最好和协调多个用户,在多进程系统中使用一些附加进程,称为后台进程。在许多操作系统中,后台进程是在实例启动时自动地建立。一个ORACLE实例可以有许多后台进程,后台进程的名字为:
DBWR数据库写入程序
LGWR日志写入程序
ARCH归档
RECO 恢复
LCKn 封锁 。

⑷ 遇到大规模oracle坏块该怎么处理

最近一两个月,一直有场景化运维、场景化大数据分析的声音围绕在耳畔,以Gdevops全球敏捷运维峰会杭州站上新炬网络执行副总裁程永新的“ 一切没有场景驱动的运维平台建设都是假大空! ”最为振聋发聩。我们一直在谈技术,谈原理,谈内核,总以为“懂了”这些的人,就势必能广阔天地大有所为。

技术固然重要,但偏离了业务/应用场景的技术,无法呈现业务价值的技术就非常不重要。

技术也应该是场景驱动的,对于运维技术人员来说,离开场景学习的所谓高深技术,只是浪费时间。所以新同事进入一个新团队后,能使技术更好发挥作用的环境、流程的考核会占据了另外的三分之二。

今天来谈谈Oracle坏块问题。 坏块问题,相信做过两三年Oracle维护、支持的DBA都会遇到过,即使从来没遇到过的,看过Oracle 官方文档的甚至是会度娘或者谷哥的,应该也知道基本的处理手段。

这是我内部分享的一个简单思维导图,如果有遗漏,欢迎在后面评论补充。

面试的时候通常是这么问的:你了解Oracle坏块么?坏块为什么会产生?描述一下你处理过的坏块案例细节?如果你负责的好几个数据库都突然发生了坏块,你会怎么做?

通常,前面几个问题的回答都不会太差。但是最后一个问题的回答,鲜有能出众的。原因在于面太窄,思维太窄。如果这个时候你还要一个个库的去看alert日志,那么显然就走错了方向。

现实情况就是,我们的数据库可能是五六十套,或者上百套,你一套套库的去看这些日志里的报错的块,再根据块找到对象,确定是表还是索引,再去用坏块的修复手段去修复…….那么,所有人都会被你害了。

我们经历过,花了两天的时间,都没修复完一个库中几万个坏块的情况,在其他大牛还在哼哧哼哧做恢复的时候,我向领导提议启用了新的方案,在大老板没有完全失去耐性的情况下恢复了业务。

真正正确的做法是,如果确定坏块数量为数众多,赶紧停业务,切灾备,后面再补数据。 灾备是干什么吃的,养库千日,用库一时,就在这个时候了!

非常可惜的是,大多数来面试的DBA会非常纠结于用block recover,还是用dbms_repair,还是用BBED,还是……

那么,什么时候往上申报,要切灾备?

且不谈许多公司的灾备形同虚设,关键时候不敢切的事情。就算这些灾备都是实实在在可用的,恐怕也不是说切立即就能切的,切灾备涉及到应用、网络、主机、存储等多方面的调整。

那么多久应该切呢? 一般的企业从故障处理开始,预估2小时之内不能让业务恢复正常运行的,应该申报切灾备。当然,如果是金融行业,特别是证券基金行业,1分钟之内故障还没恢复,就要知会证监会,半个小时没有恢复就会受到同行业通报,所以要切就应该在这个时间之内申报。

问题又回到了原点。你得先有规划,作为企业的重要系统,你得先建设灾备环境,而且是有效的灾备,并且应该事先有一个灾备切换预案。

作为DBA来说,动作敏捷的检查数据库的情况,并及时汇报非常重要。其实这里,又想说自动运维平台了。通过简单的按钮点点,就能快速知道告警日志里的坏块涉及什么对象,是不是就好很多呢?

继续往回看,面试的问题是什么?是多个数据库同时发现大量坏块。

作为一个经验丰富的运维管理人员,第一反应应该是,为什么会同时发生呢?显然是由于外因导致的。因此做好容灾切换,业务恢复使用的第一时间,应该去看看这些数据库共同的基础是不是同样的存储、同样的存储管理软件、卷管理软件。

依我的经验,大部分多个库同时出现坏块,都坏在存储管理软件身上。

有一次是Storage Foundation做卷复制的时候出现了软件bug,IBM、Oracle、symentec等众多厂家在“问题作战室”里整整呆了一个月,各家公司二线、三线出具各种证据自己没问题,最后最后才找到蛛丝马迹,揪出来。

还有一次稍微容易些,存储软件状态恢复后坏块没有恢复,一个个系统通过fsck命令来进行的修复。你说,这是什么类型的坏块呢?

作为有经验的DBA,要解决问题,但不要急着去敲命令,站在更高点的位置来看待问题,可能会事半功倍。

很不幸的前两天,某个朋友公司核心数据库“莫名奇妙”地遇到中止了。原因不方便说,但是据说等故障恢复完之后,朋友已经抽了好几包烟了。

我们先来看看,是由于LGWR终止了数据库( 注:做了一些脱敏处理 )。

但是,重启数据库却发现数据库启动不了,发现众多数据文件发生了坏块,数据库根本不能open:

同时伴随着类似的内部错误:

怎么破?通过当天的数据库备份结合归档进行恢复,远远比去修复坏块要快。

⑸ 在Oracle中数据库、表空间、表之间的关系

在oracle中,表空间是存储概念上的,建立表空间需要有对应的数据文件,数据文件建立好之后直接会把一定的磁盘空间分配给它,这样可以对数据库的存储空间进行有效的管理。然后在建表的时候指定对应的表空间,该表的数据就会都存在表空间对应的数据文件上,和Mysql那种每个表一个文件的方式比起来,存储的可控性更强。

oracle和mysql不同,不存在mysql中那种数据库的概念,而是实例的概念,当然,也可以在实例里建立不同的user来区分,每个user对应的表都是相对独立的,比如两个user下可以分别建同名的表,但又可以通过授权来交互使用。

建数据库是在安装oracle之后执行dbca建立实例。
建表空间语句是 CREATE TABLESPACE TBS_DEFAULT DATAFILE
'/app/oradata/sys_tbs/tbs_default.dbf' size 500M
LOGGING
EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO
/
这里主要是需要指定对应的datafile。

建表基本都一样,例如
create table (col_1 number(8),col_2 char(2),col_3 date)
tablespace tbs_default
/
数据库就不要删除了,这方面你看下关于user操作的语句就可以了。
drop tablespace tbs_name including contents and datafiles;--删除表空间及数据文件
drop table tab_name purge; -- 删除表。

⑹ orcal数据库简介

是Oracle吧,

Oracle数据库的体系结构

Oracle数据库包括Oracle数据库服务器和客户端。

Oracle数据库服务器:
Oracle Server是一个对象一关系数据库管理系统。它提供开放的、全面的、和集成的信息管理方法。每个Server由一个 Oracle DB和一个 Oracle Server实例组成。它具有场地自治性(Site Autonomy)和提供数据存储透明机制,以此可实现数据存储透明性。每个 Oracle数据库对应唯一的一个实例名SID,Oracle数据库服务器启动后,一般至少有以下几个用户:Internal,它不是一个真实的用户名,而是具有SYSDBA优先级的Sys用户的别名,它由DBA用户使用来完成数据库的管理任务,包括启动和关闭数据库;Sys,它是一个 DBA用户名,具有最大的数据库操作权限;System,它也是一个 DBA用户名,权限仅次于 Sys用户。

客户端:
为数据库用户操作端,由应用、工具、SQL* NET组成,用户操作数据库时,必须连接到一服务器,该数据库称为本地数据库(Local DB)。在网络环境下其它服务器上的 DB称为远程数据库(Remote DB)。用户要存取远程 DB上的数据时,必须建立数据库链。

Oracle数据库的体系结构包括物理存储结构和逻辑存储结构。由于它们是相分离的,所以在管理数据的物理存储结构时并不会影响对逻辑存储结构的存取。

1.逻辑存储结构
它由至少一个表空间和数据库模式对象组成。这里,模式是对象的集合,而模式对象是直接引用数据库数据的逻辑结构。模式对象包括这样一些结构:表、视图、序列、存储过程、同一词、索引、簇和数据库链等。逻辑存储结构包括表空间、段和范围,用于描述怎样使用数据库的物理空间。而其中的模式对象和关系形成了数据库的关系设计。

数据块(Block):是数据库进行UO操作的最小单位,它与操作系统的块不是一个概念。oracle数据库不是以操作系统的块为单位来请求数据,而是以多个Oracle数据库块为单位。

段(Segment):是表空间中一个指定类型的逻辑存储结构,它由一个或多个范围组成,段将占用并增长存储空间。

其中包括:
数据段:用来存放表数据;.
索引段:用来存放表索引;
临时段:用来存放中间结果;
回滚段:用于出现异常时,恢复事务。
范围(Extent):是数据库存储空间分配的逻辑单位,一个范围由许多连续的数据块组成,范围是由段依此分配的,分配的第一个范围称为初始范围,以后分配的范围称为增量范围。

⑺ 操作oracle数据时报乐观锁异常

户A打开应用的界面,看到数据库的某条记录

b.用户B打开应用的界面,看到同样一条记录

c. 用户A对记录做了修改

d. 对于web应用而言[假设没有应用comet类似技术],通常B不知道这个修改,这时B也对同样这条记录做修改,那B就有可能覆盖A做的修改;

这个问题在数据库中被称为丢失更新问题

2.我自己对这个问题的理解过程是这样的:

a. 不知道这个问题

我在做开发好长时间之后才意识到这个问题,意识到这个问题之后,我后来发现很长一段时间内都没真正搞明白为什么这是个问题-_- 而且我发现现在周围的很多同事,尤其是新毕业的学生,其实也一直过了很长时间都没明白这个问题,这说明吧不知道这个丢失更新问题是一个非常普遍的问题:)

b.用信号量以及操作之前再次验证的方法解决

最开始的时候,测试发现了这样一个问题,要求解决,我把操作系统的教科书搬来,对照着写了一个信号量semaphore类[那时候还是jdk 1.4.2,jdk里面没有concurrent包],花了好长时间测试这个semaphore的实现是正确的[重复发明轮子的血泪史..],

然后用来控制这个操作,每次操作前获取信号量,然后验证,再做真正的数据库操作。。。相当于在应用层每次都只做一件事。

c. 再次理解

再后来,我看了Tom的这本9i和10g的书,书中提到前面的丢失更新过程,大概有点明白为什么这是个问题

.png

但是其实我有个疑问,对于数据库中的记录而言,A做的修改本来就有可能被B覆盖的,为什么这会是一个丢失更新问题呢? 正好项目里面又出现了类似的情况,我仔细观察了下,终于明白为什么这是个问题,以及为什么要使用对应的乐观锁悲观锁方案了。下面对此做详细说明

3. 一个比较清楚的场景

下面这个假设的实际场景可以比较清楚的帮助我们理解这个问题:

假设当当网上用户下单买了本书,这时数据库中有条订单号为001的订单,其中有个status字段是’有效’,表示该订单是有效的;

后台管理人员查询到这条001的订单,并且看到状态是有效的

用户发现下单的时候下错了,于是撤销订单,假设运行这样一条SQL: update order_table set status = ‘取消’ where order_id = 001;

后台管理人员由于在b这步看到状态有效的,这时,虽然用户在c这步已经撤销了订单,可是管理人员并未刷新界面,看到的订单状态还是有效的,于是点击”发货”按钮,将该订单发到物流部门,同时运行类似如下SQL,将订单状态改成已发货:update order_table set status = ‘已发货’ where order_id = 001

如果当当的系统这样实现,显然不对了,肯定要挨骂了,明明已经取消了订单,为什么还会发货呢?而且确实取消订单的操作发生在发货操作之前啊。 因为在这样的实现下,后台管理人员无论怎么做都有可能会出错,因为他打开系统看到有效的订单和他点发货之间肯定有个时间差,在这个时间差的时候总是存在用户取消订单的可能。

4. 当时的详细解决方法。几年前当测试人员告诉我系统存在这个问题的时候,我的解决方法是这样的, 首先,先把操作系统的教科书搬来,然后对照着了一个semaphore,然后反复测试各种情况证明写的是正确的; 然后,

1. 获取一个信号量,保证每次只能有一个线程进入下面的步骤

2. 检查数据库,看这条订单是否状态是有效的

a. 如果有效则继续,进入发货步骤 b) 如果无效则返回,释放信号量,告诉用户状态已经发生改变

3. 发货,释放信号量

看到这里,也许很多人要骂我蠢了,直接把SQL语句改成下面这样吧就可以了么? update order_table set status = ‘已发货’ where order_id = 001 and status = ‘有效’ 是的,的确是这样。虽然我当时的项目的情况比和这个稍微复杂一点,涉及到多张表格,不能直接这么做,但当时的确不知道这个更新丢失问题,也没想到合适的类似方式,于是就在应用层做了这么一个每次实际上只能有一个用户在做真正的更新这样一个方式来解决,这样做的结果是,在应用层单独做了类似这么一个锁的机制。我记得当时的项目毕业答辩的时候,老师问我同步的这个问题不直接用数据库的锁的方案来解决?我当时胡乱回答了下,后来想起来,其实压根没理解老师的意思-_- 而且这样做有一个问题,假设在特殊情况下,这条订单被DBA直接修改了,没有经过应用,那么应用做这个操作也会是错的,因为在2.a到3之前的这段时间,有可能正好是DBA直接修改的时候。那么3做的操作也是不对的。 而且,现实情况是在后来的几年开发过程中,我也的确在一些不同的项目代码中看到,其他很多人也在使用类似的代码解决测试人员告诉他们的这些同步问题-_-

5.正确而简洁的解决方法

问题清楚了,也说明了我曾经使用的解决方案也是一个简洁直接的解决方案,纯粹是把简单问题复杂化,下面说说实际有效的解决方案; 就这个丢失更新问题,可以通过数据库的锁来实现,基本两种思路,一种是悲观锁,另外一种是乐观锁; 简单的说就是一种假定这样的问题是高概率的,最好一开始就锁住,免得更新老是失败;另外一种假定这样的问题是小概率的,最后一步做更新的时候再锁住,免得锁住时间太长影响其他人做有关操作;

6. 乐观锁的方法

这里先说web开发中常用的乐观锁的方法:

1.很简单,就是使用前面所说的这样一条SQL,这其实是所谓使用”前镜像”的方式来保证需要更新的数据是符合要求的,

update order_table set status = ‘已发货’ where order_id = 001 and status = ‘有效’ Tom的书上举的例子是对所有列做更新,所以他的SQL大致如下 Update table set col1 = newcol1value, col2 = newcol2value…. where col1 = oldcol1value and col2 = oldcol2value…. 这个我觉得需要根据应用具体分析,如果需要判断所有的值,那就判断所有的值,如果只关心其中一个或部分值,那只需要取相关的值就好了,就比如这里的订单的状态

2.使用版本列[比如时间戳

这个方法比较简单,也最常用,就是在数据库表格中加一列last_modified_date,就是最后更新的时间,每次更新的时候都将这列设成systimestamp,当前系统时间;

然后每次更新的时候,就改成这样 Update table set col = newvalue where id = ** and last_modified_date = old last_modified_date 这样,就可以检验出数据库的值是否在上次查看和这次更新的时候发生了变化,如果发生了变化,那么last_modified_date就变化了,以后的更新就会返回更新了0行,系统就可以通知用户数据发生了变化,然后选择刷新数据或者其他流程。

至于这个last_modified_date的维护,可以选择让应用每次都维护这个值,或者是使用存储过程来包装更新的操作,或者是使用触发器来更新相关的值。几种方法各有利弊,比如应用维护需要保证每段相关代码都正确的维护了这个值;存储过程有一定的开销,通常很多开发对写存储过程可能也不熟练;触发器是简单的实现,但是也是有开销的。具体使用哪种方法需要根据实际情况具体取舍。

3.使用校验或Hash值

这种方法和前面的方法类似,无非是根据其他有实际意义的列来计算出一个虚拟的列,我个人觉得TOM在介绍这个纯粹是介绍了一种”奇技淫巧”,反正我是在实际过程中不知道哪里会需要这样的解决方案,或许也是因为我知道的太少了吧:)

4.使用Oracle 10g的ORA_ROWSCN

这个就是利用10g的一个ora_rowscn特性,可以对每行做精确追踪,不过这个要求在create table的时候就指定相关参数,表格如果创建了以后就不能用alter table来修改了,因为这依赖于物理的实际存储。 同样,我觉得这也可以归为”奇技淫巧”一类; 具体如果有兴趣了解详情的话,可以参考Tom的书

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget

官方微博

TechTarget中国

相关资源:oracle乐观锁和悲观锁详细教程_oracle的乐观锁-Oracle文档类资源...
点击阅读全文
打开CSDN,阅读体验更佳

Oracle数据库悲观锁与乐观锁_diweikang的博客
注:对于悲观锁是针对并发的可能性比较大,而一般在我们的应用中用乐观锁足以。 Oracle的悲观锁需要利用一条现有的连接,分成两种方式,从SQL语句的区别来看,就是一种是for update,一种是for update nowait的形式。 1. 执行select xxx ...
ORACLE悲观锁和乐观锁_hongwei3344661的博客
1、无论是选择悲观锁策略,还是乐观锁策略。如果一个对象被上了锁,那么该对象都会受这个锁的控制和影响。 2、选择悲观锁策略,还是乐观锁策略,这主要是由应用和业务需求来确定的。如果你的应用和业务经常会出现从我看到要修改的记录的...
oracle 乐观锁和悲观锁详细教程
详细介绍了Oracle中乐观锁、悲观锁的原理及应用,并有实例
基于ORACLE的乐观锁实现原理
2019独角兽企业重金招聘Python工程师标准>>> ...
继续访问
Oracle之悲观锁和乐观锁_hys21的博客
根据保护的对象不同,Oracle数据库锁可以分为以下几大类:DML锁(data locks,数据锁),用于实现并发存取并保护数据的完整性;DDL锁(dictionary locks,字典锁),用于保护数据库对象的结构,如表、索引等的结构定义;内部锁和闩(internal locks ...
oracle乐观锁和悲观锁详细教程_oracle的乐观锁-Oracle文档类资源...
内部包含oracle网络网盘下载链接以及密码。 oci.dll 12版本全部 资源是从Oracle官方网站下载,已测试可用 【白雪红叶】JAVA学习技术栈梳理思维导图.xmind 乐观锁行级锁 分布式锁 分区排队 一致性 一致性算法 paxos zab nwr raft gossip ...
Oracle创建悲观锁和乐观锁
为了得到最大的性能,一般数据库都有并发机制,不过带来的问题就是数据访问的冲突。为了解决这个问题,大多数数据库用的方法就是数据的锁定。 考虑下面的情况。如果我们先查询到数据,然后更新数据。这样会出现这样的情况。A线程查询的时候,B线程也在查询,当A线程准备更新的时候,B线程先获得 了更新锁,将这些行锁定了。A只能等待B更新完。当B线程更新完释放锁的时候,A获得锁,这时A会识别出字段已经
继续访问
Oracle并发控制中的乐观锁
数据库的管理员要分散他们的数据库,以便处理基于Web,B2B,电子商务的访问,快速的硬盘读写以及更多的资源或许只能解决一部分问题。疲乏的锁机制甚至会削弱拥有很好资源的应用性能。乐观锁可以大大改善具有较多事务处理的数据库载入性能,比如基于web的客户端访问。 悲观锁引发的问题: 大多数Oracle开发者已经非常熟悉悲观锁,即在对数据进行更新之前给数据加锁。使用熟悉的SELECT...FOR UP
继续访问
oracle乐观锁悲观锁学习笔记(更新中)_Evaron.Z的博客
首先解释下乐观锁和悲观锁的含义 乐观锁:乐观锁就是认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则返回错误的信息。 悲观锁:悲观锁就是对数据的冲突采取一种悲观的...
【Oracle】乐观锁和悲观锁_◣NSD◥的博客_oracle悲观锁...
乐观锁对应于生活中乐观的人总是想着事情往好的方向发展,悲观锁对应于生活中悲观的人总是想着事情往坏的方向发展。这两种人各有优缺点,不能不以场景而定说一种人好于另外一种人。 悲观锁 ...
Oracle乐观锁悲观锁
1.乐观锁 当处理对象状态时为了防止冲突 例:一个下订单的状态status a.更新status为1购买,b取得status为1,这时a要退货把status改为2. 这时如果b还按1的状态去处理,发货了。就出错了。 正确的做法为: 当b发货时,为了处理并发脏读,需要先根据原status状态去更新status为3订单处理中 int res = update...
继续访问
【转】 Oracle中乐观锁定的四种实现方式
<br />Oracle中乐观锁定的四种实现方式<br /> <br />转自 http://www.blogjava.net/lihao336/archive/2009/09/04/293934.html<br /> 更新前在应用中存储所要操作行的“前映像”,更新时使用存储的旧记录来判断当前值是否已经改变; 使用一个特殊的列,这个列由一个数据库触发器或应用程序代码维护,可以告诉我们记录的 “版本”; 使用一个校验和或散列值,这是使用原来的数据计算得出的; 使用新增的 Oracle 10g 特性 ORA_R
继续访问
oracle的悲观锁和乐观锁
目录 1 悲观锁 1.1 单表 for update 1.2 关联表for update 1.3 解除for update 锁的占用 1.4 悲观锁缺点 2 乐观锁 2.1 比对法 2.2 版本戳 2.3 timestamp型 2.4 例子Demo 问select *from person for update或update perso...
继续访问
Oracle的悲观锁和乐观锁
为了得到最大的性能,一般数据库都有并发机制,不过带来的问题就是数据访问的冲突。为了解决这个问题,大多数数据库用的方法就是数据的锁定。 数据的锁定分为两种方法,第一种叫做悲观锁,第二种叫做乐观锁。什么叫悲观锁呢,悲观锁顾名思义,...
继续访问
oracle锁机制之悲观锁与乐观锁以及for update用法
目录 1 悲观锁 1.1 单表 for update 1.2关联表for update 1.3 悲观锁缺点 2乐观锁 2.1 比对法 2.2版本戳 2.3timestamp型 2.4 例子Demo 1 悲观锁 所谓的悲观锁:顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次拿数据的时候都会上锁。这样别人拿数据的时候就要等待直到锁的释放。 数据库行级...
继续访问
oracle的乐观锁和悲观锁
一、问题引出 ① 假设当当网上用户下单买了本书,这时数据库中有条订单号为001的订单,其中有个status字段是’有效’,表示该订单是有效的; ② 后台管理人员查询到这条001的订单,并且看到状态是有效的; ③ 用户发现下单的时候下错了,于是撤销订单,假设运行这样一条SQL: update order_table set status = ‘取消’ whe
继续访问
Oracle锁定:悲观与乐观锁详解
Oracle数据库悲观锁与乐观锁是本文我们主要要介绍的内容。有时候为了得到最大的性能,一般数据库都有并发机制,不过带来的问题就是数据访问的冲突。为了解决这个问题,大多数数据库用的方法就是数据的锁定…… 以下是代码片段: select*fromtestwhereid=10也就是没有for update这种锁定数据的语句的话,就不会造成阻塞了。另外一种情况,就是当数据库数据被锁定的时候,也
继续访问
乐观锁与悲观锁——解决并发问题
引言 为什么需要锁(并发控制)? 在多用户环境中,在同一时间可能会有多个用户更新相同的记录,这会产生冲突。这就是着名的并发性问题。 典型的冲突有: 丢失更新:一个事务的更新覆盖了其它事务的更新结果,就是所谓的更新丢失。例如:用户A把值从6改为2,用户B把值从2改为6,则用户A丢失了他的更新。 脏读:当一个事务读取其它完成一半事务的记录时,就会发生脏读取。例如:用户A,B看到的...
继续访问
乐观锁和悲观锁策略的区别与实现
乐观锁和悲观锁策略的区别与实现 1、无论是选择悲观锁策略,还是乐观锁策略。如果一个对象被上了锁,那么该对象都会受这个锁的控制和影响。如果这个锁是个排它锁,那么其它会话都不...
继续访问
oracle的共享锁不起作用,ORACLE中的乐观锁、悲观锁、共享锁、排他锁
一、引入在数据库操作中,如果不同的用户或者事务并发地访问同一数据,可能就会破坏数据到完整性,这时候我们就可以用锁来保证数据的一致性。二、概念1. 悲观锁就是很悲观地任认为我每次要修改数据时,其他的操作总会来改变我要修改的数据,于是就将其加锁。这样一来,其他人只能等待我先放开锁后才能操作数据。请看以下的示例。造数:CREATE TABLE test_yyw(id NUMBER(4),name VAR...
继续访问
oracle 锁定 问题
锁(lock)机制用于管理对共享资源的并发访问。 数据库中使用锁是为了支持对共享资源进行并发访问,与此同时还能提供数据完整性和一致性。 在Oracle中,你会了解到: ? 事务是每个数据库的核心,它们是“好东西”。 ? 应该延迟到适当的时刻才提交。不要太快提交,以避免对系统带来压力。这是因为,如果事务很长或很大,一般不会对系统有压力。相应的原则是:在必要时才提交,但是此前不要提
继续访问
最新发布 oracle数据库加悲观锁,Oracle 悲观锁跟乐观锁
EMPNO ENAME SAL7782 CLARK 2450.007839 KING 5000.007934 MILLER 1300.00在SQLplus中模拟应用可能执行的绑定调用,可以利用下面命名:SQL> variable empno numberSQL> variable ename varchar2(20)SQL> var...
继续访问
Oracle 乐观锁、悲观锁
oracle有悲观锁也有乐观锁。 悲观锁比较安全一些,可以防止丢失更新,但是就是互相等待,影响效率。 一般会用乐观锁,即开始操作时,乐观的认为数据不会被其他人更改,直到提交时才加锁检查。比如在操作的表上加一列,保存个时间戳,提交时检查是不是最新的。不过乐观锁失败的可能性比较大。 乐观锁,大多是基于数据版本( Version )记录机制实现。
继续访问
oracle乐观锁实例
oracle 悲观锁和乐观锁
写评论

评论

收藏

点赞



分享
前往CSDN APP阅读全文
阅读体验更佳

CSDN

成就一亿技术人

前往

⑻ oracle 数据库如何建表

建表方法:

(1)在cmd里边更具需要进行创建

(2)在sql developer中进行创建,而对于在可视化界面sqldeveloper中创建时,也有两种方式,即一种是使用命令直接进行创建,另外一种是使用可视化界面按钮进行点击创建