内容提示:在数据库维护的过程中,数据库管理员可能有这方面的需求。管理员要求某表中的部分数据暂时只有他自己或者某个特定的用户可以更改,而其他用户则只能够查询。如为了核对数据的需要,要暂时拒绝用户更改某些数据。这就好像在Excel表格中,对某些行进行保护。当某个用户访问这张表格时,其他用户只能够查看表格中的内容,对于受保护的数据,其他用户不能够更改、删除等等。
在Oracle数据库中可以实现这个需求吗?在数据库中,有多种方式可以实现这种方式。如将这个表所在的表空间设置为只读,或者通过更改权限来完成,设置其他用户对这个表只有只读的权限。但是,这些方法都有点小题大做。如将某个表空间设置为只读,那么任何用户都不能够对其中的数据进行更改;而且如果表空间中有很多表的话,受影响的表格会很多。如通过权限来控制虽然可以减少范围,但是数据库管理员可能只需要保护表中某些数据。即除了受保护的数据之外,其他的用户仍然可以正常访问,如可以删除、更新等等。所以,以上这两种方法虽然可以最终实现这个需求,但是由于其牵涉面太广,会在很大程度上影响其他用户的正常使用。为此这两个方法并不是笔者推荐的方法。笔者推荐的是通过行级锁来完成。下面笔者就将对这个方法进行详细的阐述,特别会强调使用过程中的注意点。
如现在数据库中有system与victor两个用户,有一个dtm_pro表。现在数据库管理员希望对这张表中的部分数据进行保护。如希望RECID1小于450的记录暂时其他用户不能够更改。其他用户之能够查询这些记录,而不能够删除或者更改。为了减少用户使用数据库的不利影响,数据库管理员要求对于RECID1大于等于450以上的记录,用户可以正常的删除或者更改等等。如下图所示,这就是具体的实现过程。
从上图中可以看出,笔者在查询语句中,加入for update of THREAD# wait 5子句。通过这个子句可以实现行级锁,从而保护结果集中的数据。一、行级锁的特征。
在Oracle数据库中,主要是通过锁来管理共享资源的。简单的说,锁就是控制当有多个用户同时访问相同的共享资源时,彼此对数据的一种额外的权限控制。在Oracle数据库中,锁可以分为行级锁与表级锁。笔者这里要谈的是行级锁。行级锁顾名思义,就是对表中的部分行加锁的一种控制机制。在理解这个行级锁的时候,笔者认为需要注意如下几个方面。
首先需要注意之所以称为行级锁,就是因为其受影响的范围只是部分的行,而不是表中的全部行。如上例所示,其所影响的行就是where条件所限制的结果级。即只是锁住where条件查询出来的结果集。而对于其他的行不受影响。其他用户可以删除、更改没被加锁的行。通过这种方式,就可以将锁对其他用户的数据库操作的不利影响降低到最低。从而实现效率与安全的并重。
第二需要注意的是,行级锁是一个排他的所。假设现在上面这两个用户都有对表dtm_pro加锁的权利。在上例中,先由用户system对表中RECID1小于450的记录加了锁。此时其他用户如victor即使其有这个权利,也无法对这张表中的这些记录进行加锁。因为行级锁是排他的。如果硬要加锁的话,则会发生死锁的现象。此时除非数据库管理员人为的利用语句进行解锁,否则的话这个死锁会长时间存在。