chenren 发表于 2007-9-20 18:13:34

在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>

jonse 发表于 2007-9-26 13:18:29

需要编程序,如果发现有写锁,其他写进程等待。

sunnyzzp 发表于 2007-9-29 09:17:58

我也经常遇到这个问题,哪位大哥可以提供点代码供参考一下~~非常感谢!

jonse 发表于 2007-10-8 15:43:44

<p>if exists (select 1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from&nbsp;&nbsp; sys.sysprocedure a join<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sys.sysuserperm b on a.creator = b.user_id<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where&nbsp; a.proc_name = 'f_table_lock' and<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.user_name = 'DBA') then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 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>&nbsp; declare end_of_cursor exception for sqlstate value '02000';<br/>&nbsp; declare userid char(128);<br/>&nbsp; declare tname char(257);<br/>&nbsp; declare cid integer;<br/>&nbsp; declare ltype char(32);<br/>&nbsp; declare lname unsigned bigint;<br/>&nbsp; declare kase integer;<br/>&nbsp; declare Fresult integer;<br/>&nbsp; <br/>&nbsp; declare iqlocks dynamic scroll cursor for call sp_iqlocks(0,IntableName,0,'t');<br/>&nbsp; <br/>&nbsp; set Fresult = 0;<br/>&nbsp; open iqlocks;<br/>&nbsp; iqlocksloop: loop<br/>&nbsp;&nbsp;&nbsp; fetch next iqlocks into cid,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; userid,tname,ltype,lname;<br/>&nbsp;&nbsp;&nbsp; if sqlstate = end_of_cursor then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; leave iqlocksloop<br/>&nbsp;&nbsp;&nbsp; end if;<br/>&nbsp;&nbsp;&nbsp; if ltype = 'W' then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set Fresult=1;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; leave iqlocksloop;<br/>&nbsp;&nbsp;&nbsp; end if;<br/>&nbsp; end loop iqlocksloop;<br/>&nbsp; close iqlocks;<br/>&nbsp; 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编辑过]

chenren 发表于 2007-11-3 16:27:45

安装最新版补丁可以解决了。谢谢!

select @m_Sql = 'LOCK TABLE DBA.tablename IN WRITE MODE WAIT'<br/>&nbsp;execute (@m_Sql)

标榜天下 发表于 2010-10-25 17:08:35

学习加关注中。。。。

tiger123 发表于 2011-1-13 14:09:56

Sybase IQ 的锁粒度是表级别,多个事物同时更新表(不论事跟新多少记录)时只能有一个事物获得W锁,其他事物会失败的。
页: [1]
查看完整版本: 在IQ里如果有2个进程同时对一个表操作,会报transaction错误,如何解决?

免责声明:
本站所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:Admin@SybaseBbs.com