2016-05-12 123 views
0

我毫不犹豫地承认,我对于sybase的返回代码一无所知。我的经验主要与Oracle和SQL Server有关。这个特定的项目需要插入一个表的二进制字段,该表定期失败,因为该条目被锁定。看看代码,它不会显示我能够成功检测到锁定条件。我目前的策略是插入数据,然后选择并确定插入是否成功,如果未使用在重试尝试之间休眠几秒钟的线程,请重试。这无法解释其他数据,这些数据可能在我原始数据插入之前改变了条目,并且可能比我试图插入的数据更新。有没有简单的方法来确定在尝试插入之前该行是否被锁定,等待锁定清除,然后在插入之前自行锁定该行?或者,如果我可以检测到条目已被锁定,那么我可以使事务失败并提醒用户出现故障,以便可以手动检查它。在任何人询问之前,我无法改变RDMS的体系结构来设置锁定条目。这必须由执行插入的代码来处理。检查由于页面锁定而导致的插入失败

+0

'LOCK TABLE <

>以独占方式NOWAIT'会尝试你的桌子上获得排它锁。如果检查失败,请检查“@@ error!= 0” – Meet

回答

0

尝试:

BEGIN TRANSACTION 

    LOCK TABLE <<table_name>> 
     IN EXCLUSIVE MODE NOWAIT 

    IF @@error != 0 
    BEGIN 
     ROLLBACK TRANSACTION 
     PRINT 'COULD NOT ACQUIRE LOCK. EXITING ...' 
     RETURN 0 
    END 

    << your code here if it was able to lock >> 

COMMIT TRANSACTION 
+0

我对sybase并不感兴趣,但似乎有点矫枉过于必须锁定整个表才能尝试检测单个记录被阻止更新/插入? – Bill

1

锁定整个表会的工作,但如果你只是寻找一个页面的小粒度(按你的问题的标题)相当粗糙。 实际上,您可以通过在INSERT之前执行SET LOCK NOWAIT,然后检查@@ ERROR获取状态码12205,该状态码指示为执行插入操作而需要执行某些操作时锁定了该状态码。不要忘记运行SET LOCK WAIT以恢复默认设置,否则NOWAIT将应用于会话的其余部分。

+0

不错,不知道你可以指定它在全球范围内的一个会议,他们也将使用自己的锁定机制..好! – Meet

相关问题