Erp100论坛's Archiver

xiangzhao 发表于 2008-7-12 15:57

select ...for update使用疑问

我在一个存储过程中,首先查询出一个字段(一条记录),然后经过判断后需要更改这个字段,在判断过程中不希望有别的线程或者程序更改这个字段。
在这个时候使用select...for update是否正确,对性能影响多大?有没有性能更好得解决办法?

xiangzhao 发表于 2008-7-12 15:58

select...for update nowait;

if special nowait,if the row is locked by other;you will get an error;
if you have lock the row,other can not modify it.

it does not matter performance

xiangzhao 发表于 2008-7-12 15:58

select ... for update nowait
其中nowait是可选项。
此子句的意思就像他的字面意思,也就是说现在执行的select操作是为了本事务中的后续的update服务的。这时候系统会试图锁定查询出来的记录,不允许其他事务修改它们。如果指定了nowait,则系统如果无法锁定记录,就会直接报错,并不会等待其他占有资源的事务释放资源。我这有一些我做的测试结果
事务A:Select  *  From  Test_A  Where  ID = ’01’  For  Update  NoWait;
事务B:Select  *  From  Test_A  Where  ID = ’01 ’  For  Update ;
事务C:Update  Test_A  Set  Name = ’Test_01’  Where  ID = ‘01’ ;
执行顺序        执行结果
首先        然后        执行结果
----            ----            ----
事务A        事务A        系统报错:ORA-00054: 资源正忙,要求指定 NOWAIT
事务A        事务B        事务B挂起,等待事务A释放资源
事务A        事务C        事务C挂起,等待事务A释放资源
事务B        事务A        系统报错:ORA-00054: 资源正忙,要求指定 NOWAIT
事务B        事务B        事务B挂起,等待事务A释放资源。
事务B        事务C        事务C挂起,等待事务B释放资源
事务C        事务A        系统报错:ORA-00054: 资源正忙,要求指定NOWAIT
事务C        事务B        事务B挂起,等待事务C释放资源

不过在OEM中的PL SQL WORKSHEET中执行的话,如果执行倒数第2个实验,执行第2个事务A只有执行超过3次后,OEM才会报错,前几次OEM好象是忽略此操作。

页: [1]

Powered by Discuz! Archiver 7.0.0  © 2001-2007 Comsenz Inc.