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个块上。分别为1,2在块1,3,4在块2.如果你修改了记录2.那么记录1的scn也会递进。其实也就明白了这其实还是很怪异的。毕竟,如果两句SQL更新了数据库上同一块上两条不同的记录。那么有一条肯定会失败。
如果你一点每条块独享。那么可以使用ROWDEPENDENCIES这个参数,在建立表的时候
如果需要把Rowscan转换成时间。可以害死scn_to_timestamp(ora_rowscn)。说句实话。我觉得很怪。为什么不弄一个字段,而是函数