检查由于页面锁定导致的插入失败

时间:2016-05-12 12:39:54

标签: sybase-ase

我坦率地承认,就其返回码而言,我对sybase一无所知。我的经验主要是Oracle和SQL Server。此特定项目需要插入到表的二进制字段中,因为该条目已锁定,因此会定期失败。看一下代码,我似乎无法成功检测出锁定状态。我当前的策略是插入数据,然后选择并确定插入是否成功,如果它没有使用在重试尝试之间休眠几秒钟的线程,则重试。这无法解释可能在原始数据插入之前更改条目的其他数据,并且可能比我尝试插入的数据更新。有没有一种简单的方法可以确定在尝试插入之前是否锁定了行,等待锁清除,然后在插入之前自己锁定行?或者,如果我可以检测到条目被锁定,那么我可以使事务失败并提醒用户失败,以便可以手动检查它。在有人要求之前,我无法根据如何设置锁定条目来更改RDMS的体系结构。这必须由执行插入的代码处理。

2 个答案:

答案 0 :(得分:1)

锁定整个表格会有效,但如果您只是寻找较小的页面粒度(根据问题的标题),则会非常粗糙。 实际上,您可以通过在INSERT之前执行SET LOCK NOWAIT然后检查@@ ERROR以获取状态代码12205来执行此操作,这表示在执行插入时需要锁定某些内容。不要忘记运行SET LOCK WAIT来恢复默认值,或者NOWAIT将适用于你的其余会话。

答案 1 :(得分: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