WEB开发网
开发学院数据库DB2 SQL语句优化DB2应用程序性能 阅读

SQL语句优化DB2应用程序性能

 2008-08-27 16:26:24 来源:WEB开发网   
核心提示: 指定FOR UPDATE子句的另外一个好处是可以减少应用程序的死锁机会,死锁是这样一种情形:一个以上的应用程序等待另外一个应用程序释放对数据的锁定,SQL语句优化DB2应用程序性能(4),而那些等待的应用程序正占据着另外应用程序所需要的数据,并且对该数据也进行了锁定,“YES&

指定FOR UPDATE子句的另外一个好处是可以减少应用程序的死锁机会。死锁是这样一种情形:一个以上的应用程序等待另外一个应用程序释放对数据的锁定,而那些等待的应用程序正占据着另外应用程序所需要的数据,并且对该数据也进行了锁定。我们假设两个应用程序按下列顺序同时对同一行进行提取、更新操作:

(1)应用程序1提取该行

(2)应用程序2提取该行

(3)应用程序1更新该行

(4)应用程序2更新该行

在第4步,应用程序2将等待应用程序1完成更新操作,还要等应用程序1释放占据锁定,然后才能开始应用程序2的更新操作。可是,当我们声明一个游标时不指定FOR UPDATE子句,应用程序1就会获得并占据一个S(共享)锁定,对该行加锁(第1步),这意味着第二个应用程序用不着等待也可以获得并占据一个S锁(第2步)。然后,第一个应用程序试图获得一个U(更新)锁以处理更新语句,但是它必须等第二个应用程序释放其正占据着的S锁(第3步)。同时,第二个应用程序也试图获得一个U锁,并且由于第一个应用程序占据着S锁而进入等待状态(第4步)。这种情形就是死锁,造成的后果是应用程序1或应用程序2的交易不得不回滚。

如果在DECLARE CURSOR语句中指定FOR UPDATE子句,当应用程序1提取该行时,将会给该行加上U锁,应用程序2将会等待应用程序1释放U锁,这样,两个应用程序之间就不会发生死锁了。

下面举例说明如何在SELECT语句中使用FOR UPDATE子句。

  EXECSQLDECLAREc1CURSORFORSELECT*FROMemployee
FORUPDATEOFjob;
EXECSQLOPENc1;
EXECSQLFETCHc1INTO…;
If(strcmp(change,“YES”)==0)
EXECSQLUPDATEemployeeSETjob=:newjob
WHERECURRENTOFc1;
EXECSQLCLOSEc1;

对于CLI编程,我们可以使用函数SQLSetConnectAttr()将DB2 CLI的连接属性SQL_ATTR_ACCESS_MODE的值设置为:SQL_MODE_READ_WRITE,效果是一样的。

上一页  1 2 3 4 5 6  下一页

Tags:SQL 语句 优化

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接