|
|
原帖由 zhaolinjnu 于 2008-6-9 16:36 发表 ![]()
首先不论此需求的合理性,对于此需求的实现,这里有另外一种思路?
首先创建另外一张表,插入一条类似下面这样的记录:
insert into select_ctl(table_name,lock_start,lock_end,status) values('TEST',SYSDATE,SYSDATE,0);
这张表可以称为对Test表的select查询访问控制表,status有两个状态:0 未锁定;1 锁定中
当要进行select查询时:
1.更新控制表select_ctl中的记录 update select_ctl set lock_start=sysdate,lock_end=null,status=1 where table_name='TEST' and status=0;
commit;
2.判断更新的结果集行数,如果为1,则进行相要的select查询(如果为0,则在应用层等待一下,再次返回到第一步中的更新):
比如说: select * from test;
3.查询完成后,更新控制表select_ctl,以便其它的会话可以进行查询
update select_ctl set lock_end=sysdate,status=0 where table_name='TEST' and status=1;
commit;
如果这类的需求一定要处理,并且采用此设计实现,可以对select_ctl表中的记录进行监控。
看似简单其实问题挺多
除了杨大师说的事务问题,还有个问题:
“如果为0,则在应用层等待一下,再次返回到第一步中的更新”
如何调度?等待一下是多久?如果第n次也没等到怎么办? |
|