Oracle学习笔记(六)

52 锁:

    其实锁是每个数据库用于处理并发问题的一种手段。也就是在这里,使得数据库与数据库之间。产生了很大的不同。至少对于一个开发者来说。这里的不同相对于其他方面,会是最巨大,最实用的一个方面。书中,作者引用了一个自己的例子,可以看看。

        大体上来说。就是在除Oracle之外的数据库中,如果你要使用锁。消耗将会是巨大的。而在Oracle中,锁的机制使得锁的使用,并非那么消耗资源。对一行加锁和对10000行加锁的消耗,完全相同。

 

53丢失更新

       丢失更新是一个很神出鬼没的问题。因为在实际过程中,如果出现这种问题,真的很难排查。这并不是危言耸听。因为首先,出现这种问题对于大多数应用来说,可能性比较低。毕竟在同一时间段更新同一字段。也就是说,发生的时候,你可能想不到这一点。其次,如果发生,并且你不能重复的话,找寻的过程,几乎等同于大海捞针。而且估计并非每个应用都需要,比方说我现在在维护的系统,没有做任何防护,但是几乎没有相关的问题。

     但是,这确实必要考虑的问题。

 

54悲观锁。

       所谓悲观,和乐观。其区别在于对于并发问题的态度。悲观锁认为,如果你更新一个字段。那么势必一定会有并发性问题。这是挺悲观的。其实是否用悲观锁,除了悲观之外,关键在于这个业务是否需要用户参与处理更新的过程。

       而悲观锁的使用,Select之后加入一句For update nowait

如果出现问题,会出现以下3种情况。

第一,如果底层没有更新,那么会锁定这一行

第二,如果另一个用户在更新这一行。将会得到一个ORA-00054:resource busy的错误。必须等待

 第三,在获取和更新之间。如果有人已经修改了这一行。我们就会无法更新。如果需求如此。那么就需要重新查询

 

关于这里。我有以下几点收获。

其一,了解了判断更新的作用。以前我觉得这个很无聊

其次。悲观锁定,尽用于有状态或者有连接的环境。关于这点,其实我有疑惑的。即专属连接。我是这样理解的。只有在连接的时候。一个事物才能完成。因为悲观锁,其实是利用数据库的功能来进行

 

55.乐观锁

曾经听过,乐观锁其实不能算是一种锁。这不得不说有着几分道理。因为乐观锁的实现,本质上来说是借用程序的逻辑而不是数据库本身就有的功能。在Oracle上来说,其实现用3中方法

1,加入时间戳的字段。其实这里可以应用于任何数据库。优势在于方便。缺点么,耦合了。

2.  计算散列值。通过散列值来确定数据库是否更新。具体是使用数据库的几个函数。不过具体操作时,估计可以用程序来计算。但是缺点在于这种计算很消耗CPU资源

3.使用ORA_ROWSCN,这是10g才提出的功能。很方便。每当你自动递进

不过有点麻烦的地方。即RowScn是是块共享的。书中的例子,4条记录在2个块上。分别为12在块134在块2.如果你修改了记录2.那么记录1scn也会递进。其实也就明白了这其实还是很怪异的。毕竟,如果两句SQL更新了数据库上同一块上两条不同的记录。那么有一条肯定会失败。

如果你一点每条块独享。那么可以使用ROWDEPENDENCIES这个参数,在建立表的时候

如果需要把Rowscan转换成时间。可以害死scn_to_timestamp(ora_rowscn)。说句实话。我觉得很怪。为什么不弄一个字段,而是函数

你可能感兴趣的:(oracle,sql)