学习《Oracle 9i10g编程艺术》的笔记 (十) 锁
1.在Oracle 中,你会了解到:
事务是每个数据库的核心,它们是“好东西”。
应该延迟到适当的时刻才提交。不要太快提交,以避免对系统带来压力。这是因为,如果
事务很长或很大,一般不会对系统有压力。相应的原则是:在必要时才提交,但是此前不要提
交。事务的大小只应该根据业务逻辑来定。
只要需要,就应该尽可能长时间地保持对数据所加的锁。这些锁是你能利用的工具,而不
是让你退避三舍的东西。锁不是稀有资源。恰恰相反,只要需要,你就应该长期地保持数据上
的锁。锁可能并不稀少,而且它们可以防止其他会话修改信息。
在Oracle 中,行级锁没有相关的开销,根本没有。不论你是有1 个行锁,还是1 000 000
个行锁,专用于锁定这个信息的“资源”数都是一样的。当然,与修改1 行相比,修改1 000 000
行要做的工作肯定多得多,但是对1 000 000 行锁定所需的资源数与对1 行锁定所需的资源数
完全相同,这是一个固定的常量。
不要以为锁升级“对系统更好”(例如,使用表锁而不是行锁)。在Oracle 中,锁升级(lock
escalate)对系统没有任何好处,不会节省任何资源。也许有时会使用表锁,如批处理中,此
时你很清楚会更新整个表,而且不希望其他会话锁定表中的行。但是使用表锁绝对不是为了避
免分配行锁,想以此来方便系统。
可以同时得到并发性和一致性。每次你都能快速而准确地得到数据。数据读取器不会被数
据写入器阻塞。数据写入器也不会被数据读取器阻塞。这是Oracle 与大多数其他关系数据库之
间的根本区别之一。
2.丢失更新
丢失更新(lost update)是一个经典的数据库问题。实际上,所有多用户计算机环境都存在这个问
题。简单地说,出现下面的情况时(按以下所列的顺序),就会发生丢失更新:
(1) 会话Session1 中的一个事务获取(查询)一行数据,放入本地内存,并显示给一个最终用户User1。
(2) 会话Session2 中的另一个事务也获取这一行,但是将数据显示给另一个最终用户User2。
(3) User1 使用应用修改了这一行,让应用更新数据库并提交。会话Session1 的事务现在已经执行。
(4) User2 也修改这一行,让应用更新数据库并提交。会话Session2 的事务现在已经执行。
这个过程称为“丢失更新”,因为第(3)步所做的所有修改都会丢失。例如,请考虑一个员工更新屏幕,
这里允许用户修改地址、工作电话号码等信息。应用本身非常简单:只有一个很小的搜索屏幕要
相关文档:
安装Oracle Database(10.0.2)后,如果修改机器名后,
会导致控制面板的服务中启动OracleTNSLisener服务立刻就停止。
使用命令行工具,提示如下:
(机器名原来为:ANSWER-1738E000,改为:ANSWER)
解决方法:
1>关掉控制面板中有关于 Oracle Database 的服务。
2>修改 C:\oracle\product\10.2.0\db_1\NE ......
跟着这几天Oracle OpenWorld大会的举行,Oracle11g的新特征越来越多的被展现出来。
以前,我曾经引见过Oracle11g将可能在10月份的这个大会上推出,当初至于Alpha版的信息已经可以见到,现时出现的已经是Beta版,离Oracle11g的正式版已经不远。
Laurent Schneider 在他的Blog中谈到,对于Oracle11g的名字还 ......
1.数据库独立性
将应用从数据库A 移植到数据库B 时,我时常遇到这种问题:应用在数据库A 上原本无懈可击,到了
数据库B 上却不能工作,或者表现得很离奇。看到这种情况,我们的第一个想法往往是,数据库B 是一个
“不好的”数据库。而真正的原因其实是数据库B 的工作方式完全不同。没有哪个数据库是错的 ......
Oracle创建表时,常遇到先删除后创建的情况,而它又没有drop table... if exists语法。为此可以使用user_objects数据字典和动态sql语句实现类似的功能,如下所示:
create or replace procedure proc_dropifexists(
p_table in varchar2
) is
v_count number(10);
begin
&nbs ......