oracle锁介绍

      锁(lock)机制用于管理对共享资源的并发访问。注意,我说的是“共享资源”而不是“数据库行”。Oracle会在行级对表数据锁定,这固然不错,不过Oracle也 会在其他多个级别上使用锁,从而对多种不同的资源提供并发访问。例如,执行一个存储过程时,过程本身会以某种模式锁定,以允许其他用户执行这个过程,但是 不允许另外的用户以任何方式修改这个过程。数据库中使用锁是为了支持对共享资源进行并发访问,与此同时还能提供数据完整性和一致性。

      在单用户数据库中,并不需要锁。根据定义,只有一个用户修改信息。不过,如果有多个用户访问和修改数据或数据结构,就要有一种机制来防止对同一份信息的并发修改,这一点至关重要。这正是锁定所要做的全部工作。

      Sql Server在没有行锁的情况下,如果采用页级锁,多个用户就不能同时修改同一个表。另外,如果正在修改一个表,这会有效地阻塞对这个表的多个查询。如果我想查询一个表,而且所需的页被一个更新锁住了,那我就必须等待(等待,再等待……)。这种锁定机制太糟糕了,要想支持耗时超过1秒 的事务,结果可能是致命的;倘若真的这样做了,整个数据库看上去可能就像是“冻住”了一样。我从这里学到了很多坏习惯。我认识到:事务很“不好”,应该尽 快地提交,而且永远不要持有数据的锁。并发性要以一致性为代价。要么保证正确,要么保证速度,在我看来,鱼和熊掌不可兼得。

      然而,Oracle却推翻了我在Sql Server中得出的结论。

      在Oracle中,你会了解到:

      1. 事务是每个数据库的核心,它们是“好东西”。 

      2. 应该延迟到适当的时刻才提交。不要太快提交,以避免对系统带来压力。这是因为,如果事务很长或很大,一般不会对系统有压力。相应的原则是:在必要时才提交,但是此前不要提交。事务的大小只应该根据业务逻辑来定。

      3. 只要需要,就应该尽可能长时间地保持对数据所加的锁。这些锁是你能利用的工具,而不是让你退避三舍的东西。锁不是稀有资源。恰恰相反,只要需要,你就应该长期地保持数据上的锁。锁可能并不稀少,而且它们可以防止其他会话修改信息。

      4. 在Oracle中,行级锁没有相关的开销,根本没有。不论你是有1个行锁,还是1 000 000个行锁,专用于锁定这个信息的“资源”数都是一样的。当然,与修改1行相比,修改1 000 000行要做的工作肯定多得多,但是对1 000 000行锁定所需的资源数与对1行锁定所需的资源数完全相同,这是一个固定的常量。

      5. 不要以为锁升级“对系统更好”(例如,使用表锁而不是行锁)。在Oracle中,锁升级(lock escalate)对系统没有任何好处,不会节省任何资源。也许有时会使用表锁,如批处理中,此时你很清楚会更新整个表,而且不希望其他会话锁定表中的行。但是使用表锁绝对不是为了避免分配行锁,想以此来方便系统。

      6. 可以同时得到并发性和一致性。每次你都能快速而准确地得到数据。数据读取器不会被数据写入器阻塞。数据写入器也不会被数据读取器阻塞。这是Oracle与大多数其他关系数据库之间的根本区别之一。

      注:《ORACLE9i&10g编程艺术》阅读笔记

     

你可能感兴趣的:(数据结构,oracle,sql,编程,SQL Server)