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