oracle 锁和闩_笔记4:使用校验和的乐观锁定
使用校验和的乐观锁定
这与前面的版本列方法很相似,不过在此要使用基数据本身来计算一个“虚拟的”版本列。为了帮助解释有关校验和或散列函数的目标和概念,以下引用了Oracle Database 11g Release 2 PL/SQL Supplied Packages Guide中的一段话:单向散列函数取一个变长输入串(即数据),并把它转换为一个定长的输出串(通常更小),这个输出称为散列值(hash value)。散列值充当输入数据的一个唯一标识符(就像指纹一样)。可以使用散列值来验证数据是否被修改。需要注意,单向散列函数只能在一个方向上应用。从输入数据计算散列值很容易,但是要生成能散列为某个特定值的数据却很难。
与使用版本列的做法一样,我们可以采用同样的方法使用这些散列值或校验和,只需把从数据库读出数据时得到的散列或校验和值与修改数据前得到的散列或校验和值进行比较。在我们读出数据之后,但是在修改数据之前,如果有人在这段时间内修改了这一行的值,散列值或校验和值往往会大不相同。
有很多方法来计算散列或校验和。这里列出其中的4种方法,分别在以下3个小节中介绍。所有这些方法都利用了Oracle提供的数据库包。
.OWA_OPT_LOCK.CHECKSUM:这个方法在Oracle8i 8.1.5及以上版本中提供。给定一个串,其中一个函数会返回一个16位的校验和。给定ROWID时,另一个函数会计算该行的16位校验和,而且同时将这一行锁定。出现冲突的可能性是65536分之一(65536个串中有一个冲突,这是假警报的最大几率)
.DBMS_OBFUSCATION_TOOLKIT.MD5:这个方法在Oracle8i 8.1.7及以上版本中提供。它会计算一个128位的消息摘要。
.DBMS_CRPYTO.HASH:这个方法在Oracle Database 10g Release 1及以上版本中提供。它能计算一个SHA-1(安全散列算法,Secure Hash Algorithm 1)或MD4/MD5消息摘要。建议使用SHA-1算法。
.ORA_HASH:这个方法是Oracle Database 10g Release 1 及以上版本中才有的。这是一个内置SQL函数,取一个varchar2值作为输入,还可以有另外一对输入(可选)来控制返回值。返回的值是一个数值,默认为0到4294967295的一个数。
计算列值或校验和是一个CPU密集型操作(相当占用CPU),其计算代价很昂贵。如果系统上CPU是稀有资源,在这种系统上就必须充分考虑这一点。不过,如果从“网络友好性”角度看,这种方法会比较好,因为只需在网络上传输相当小的散列值,而不是行的完整的前映像和后映像(以便逐行地进行比较),所以消耗的资源会少得多。
本文来源 我爱IT技术网 http://www.52ij.com/jishu/5194.html 转载请保留链接。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
