通过加锁控制Oracle数据库并发事务

在Oracle数据库中要处理并发的话,可以通过加锁,和设置只读事务,以及设置隔离级别来控制处理并发。今天主要介绍的是通过加锁来控制并发事务。

在并发控制中,Oracle主要利用了事务的特性和锁的机制。锁可以防止用户访问同一数据是相互干扰,而事务之间存在着不同级别的隔离作用。

通过加锁避免写数据丢失在Oracle中,解决两个写事务冲突的方法就是采用“加锁”。如当A事务要修改--数据时,就对该数据加锁,禁止其他事务对该数据的修改。只有当A事务完成写操作并将锁打开后,才运行其他事务的写操作。我们通过加锁可以防止两个写事务同时对-一个数据进行修改,所以也就不会出现写数据丢失的问题。

在执行UPDATE、INSERT和DELETE语句时,Oracle会自动加“行锁”,即对写语句涉及的那些记录加锁。这样用户就不必在写操作时再进行加锁工作,可以放心地执行插入.修改和删除操作,而不用顾及其他用户事务的存在。

如果自动加锁功能不能满足要求,用户还可以通过执行SQL的锁语句实现人工加锁。在Oracle中,我们可通过LOCK命令人工对表加锁。语法如下。LOCKTABLEtable_nameIN(EXCLUSIVEISHARELOCKI}MODE[NOWAIT]

说明如下。table_name为要锁定地表的表名。IN后面指定加锁方式,EXCLUSIVE是排他锁,即只运行其他事务对该表的查询,而禁止其他任何操作。

SHARELOCK为共享锁,允许相关资源共享,即几个事务同.时读取同一数据时,这几个事务就可以对同一数据资源施加共享锁。NOWAIT是指当要锁定的表已被其他用户锁定时,系统立即返回控制,并给出提示信息。

如果没有指定该选项,该语句就处于等待状态,-一旦该表被解除锁定,就执行本语句的加锁功能,然后返回控制。在Oracle中,执行UPDATE、INSERT和DELETE语句时,系统会自动加锁(排他锁)。

而对于读语句(SELECT语句),系统不会加锁。但有些时候,系统读取数据的目的就是为了后续的写操作。如职工部门调整时,需要先从职工信息表Employee中读出职工现在的部门,而后再根据现在部门调整到新部门,在这种情况下,用户需要在读语句时就加锁,这样读出的数据就不会变了,便于调整。

Oracle允许在SELECT语句中指定加锁子句,如下面的代码所示。SELECTEname,Department,Oracle中的并发事务控制FROMEmployeeWHEREAge-40FORUPDATEOFDepartment

上述代码首先查询符合搜索条件的行,即年龄小于40岁的职工记录,然后锁定这些记录行的Depatement列,这就为稍后修改这些记录做好了准备。

无论是自动加锁还是人工加锁,当写操作完成后,我们都应立即解锁,否则会影响到其他的写操作。解锁的方法就是结束事务,因为锁只在事务的范围内有效,当事务结束时,锁也就被释放。

与SQLServer数据库一样,有锁的存在就可能出现“死锁”现象。在Oracle系统中,当系统检测到一个死锁时,会给引起死锁的其中-一个事务发出一个错误信息,然后回滚该事务的当前语句。这样其他的事务就可以顺利进行,也就解除了死锁。




转载请注明:http://www.xcqg58.com/pxxx/pxxx/26846691.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了