Oracle的update语句问题:
update config t set t.value =1 where t.key='DB_ KEY'
或者:
select * from config t where t.key='DB_KEY' for update
这个update会试图为where条件指定的那些数据加上行级锁,但如果此时这些数据已经被其他事务加锁了,则会一直等待,直到锁被释放,然后再去竞争这些数据的锁。
问题是,我不想让它一直等待,如果加不上锁就立即返回失败信息。对于select ... for update语句,可以用如下方式:
select ... for update nowait(加锁失败则立即报错)
select ... for update wait 3(最多等待3秒)
但仅限于select ... for update语句,update语句没有这个功能。而且,这是Oracle数据库所特有的功能。
我在设计多服务器、多线程数据库同步操作时,最开始是采用的如下方式:// 如果更新成功了,则i=1,否则i=0
int i = "update config t set t.flag =1 where t.key='DB_KEY' and t.flag=0";
// 当i=1时才允许去做查询和更新数据
if(i==1) do query & update DATA;
// 查询完之后将DB_KEY的flag改回原来的值
update config