在IQ里如果有2个进程同时对一个表操作,会报transaction错误,如何解决?
<p>在IQ里,多个用户对同一个表操作,如:update,会报错:Cannot open the requested object for write in then current transaction(48846) Anther ser has write access in transaction 48843。期待高手解惑!</p> 需要编程序,如果发现有写锁,其他写进程等待。 我也经常遇到这个问题,哪位大哥可以提供点代码供参考一下~~非常感谢! <p>if exists (select 1<br/> from sys.sysprocedure a join<br/> sys.sysuserperm b on a.creator = b.user_id<br/> where a.proc_name = 'f_table_lock' and<br/> b.user_name = 'DBA') then<br/> drop procedure DBA.f_table_lock ;<br/>end if ;<br/>CREATE FUNCTION "DBA"."f_table_lock"(IntableName varchar(100) )<br/>returns integer<br/>begin</p><p> declare end_of_cursor exception for sqlstate value '02000';<br/> declare userid char(128);<br/> declare tname char(257);<br/> declare cid integer;<br/> declare ltype char(32);<br/> declare lname unsigned bigint;<br/> declare kase integer;<br/> declare Fresult integer;<br/> <br/> declare iqlocks dynamic scroll cursor for call sp_iqlocks(0,IntableName,0,'t');<br/> <br/> set Fresult = 0;<br/> open iqlocks;<br/> iqlocksloop: loop<br/> fetch next iqlocks into cid,<br/> userid,tname,ltype,lname;<br/> if sqlstate = end_of_cursor then<br/> leave iqlocksloop<br/> end if;<br/> if ltype = 'W' then<br/> set Fresult=1;<br/> leave iqlocksloop;<br/> end if;<br/> end loop iqlocksloop;<br/> close iqlocks;<br/> return Fresult;<br/>end;<br/>select "DBA"."f_table_lock"('DBA.test');<br/></p><p><br/>如果返回值为1 表示存在写锁,可以采用语句 WAITFOR { DELAY time | TIME time } 等待一定时限,或者到某一时点。</p><p></p>[此贴子已经被作者于2007-10-8 15:46:25编辑过]
安装最新版补丁可以解决了。谢谢!
select @m_Sql = 'LOCK TABLE DBA.tablename IN WRITE MODE WAIT'<br/> execute (@m_Sql) 学习加关注中。。。。 Sybase IQ 的锁粒度是表级别,多个事物同时更新表(不论事跟新多少记录)时只能有一个事物获得W锁,其他事物会失败的。
页:
[1]