oracle锁简述

不同的数据库它的锁定机制是不同的,即使表面上看是一样的(都是行级锁),但是他们的实现方法也是完全不同的。

一、综述

在oracle中,你会了解到:

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

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

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

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

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

二、悲观锁和乐观锁

1、悲观锁(pessimistic locking)

在试图更新之前我们就把行锁住了,因为我们很悲观,对于这一行能不能保持未改变很是怀疑。

如何实现悲观锁:加for update nowait

保证最初读出数据之后,在我们更新之前数据没有改变。

2、乐观锁(optimistic locking)

把所有锁定都延迟到即将执行更新之前才做。
可以在update中同时保留新值和旧值,例如
update emp set sal = 2000 where empno = 100 and sal = 1000;
乐观锁如果update返回0行,说明数据在查询之后被修改了。
继续阅读oracle锁简述