锁定(lock)是一种机制,它用来管理对一个共享资源的并行访问。oracle确实在行一级锁定表数据,但是它也在其他级上使用锁定,以提供对不同资源的并行访问。例如,当运行存储过程时,过程本身在允许其他过程运行的模式中也是锁定的,但不劲旅另一个用户以任何方式对它发出 警告。应用于数据库中的锁定,允许对这些共享资源并行访问,但同时,提供数据的完整性和一致性支持。
锁定用在多用户访问并更改数据或数据结构时。锁定的目的:以适当的机制来防止对相同的信息段进行并行修改。
了解了一个特殊的RDBMS封锁模型并不意味就了封锁的全部模型。
在oracle中,应该知道:<1>事务处理是数据库的全部工作,它们是好的事务、
<2>只要必须,就应该推迟提交。不应该迅速地提交面给系统重压。其规则是:在必须提交时提交,而不是在必须提交之前提交。事务应该只是和商务逻辑规定的大小一样。
<3>只要需要,就应该保持对数据的锁定。它们是可供使用的工具,不是要避免的东西。锁定不是一个稀有的资源。
<4>在oracle中行一级锁定不包含开销。
<5>不应该由于系统上的性能较好而将锁定扩大(例如,使用代替使用行锁定)。在oracle中。这样不会系统更好----它不会节省任何资源。
<6>可以获得并行处理和一致性。可以既快又准确得到,且每次都一样。
两种封锁类型:<1>悲观封锁 <2>乐观封锁
1.悲观封锁
此封锁方法在修改屏幕上的一个值之前就要 开始发挥作用。
没有封锁用户查询数据的输出为:
sql>select empno,sal from emp where deptno=10;
EMPNO ENAME
------------------ ------------
7782 CLARK
7839 KING
7934 MILLER
最后,用户获得想要更新的行。假设在这种情况下,他们选择更新MILLER行。应用程序在那里及时(在他们在屏幕上做出任何更改之前)发出下面命令:
sql>select empno,ename,sal from emp where empno=:empno and ename=:ename and sal=:sal for update nowait
应用程序所执行的是,给屏幕上数据的绑定变量(bind variables)提供值(这里是7934、MILLER和1300),并从数据库中重新查询这个相同的行--这次,封锁该行,以防其他的会话对其的更新。这是此方法叫做悲观锁定的原因,在试图更新之前封锁行,否则的话,我们会怀疑那个行没有更改。
因为每一个表都 有一个主码(primary key)主码应该是不变的(我们不应该更新它们)。我们将获得下面陈述中的3个结果中的一个:<1>如果基本数据没有更改,那么我们将获得MILLER行,这一行将被锁定,不能由其他人更新。
<2>如果另一个用户在修改那一行的进程中,我们将获得“ORA_00054”资源忙的错误,我们被阻塞,必须等待该用户完成工作。<3>在选择数据和指出更新意图之间的时间里,如果有人已经更改了那个行,那么我们将获得零行。
2.乐观封锁
sql>update table set columen1=:new_columen1 where columen1=:old_columen1;
如果更新了一行---数据在读取和提交更新这段时间没有更改。如果更新了零行,将丢失更新---其他人更改了数据。,现在我们必须搞明白为了避免丢失更新而做的事情。最终用户在对行查询了新的值之后应该重新输入事务吧