【问题标题】:Check for Insert Failure Due to Page Lock检查由于页面锁定导致的插入失败
【发布时间】:2016-05-13 19:09:05
【问题描述】:

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

【问题讨论】:

  • LOCK TABLE <<table>> IN EXCLUSIVE MODE NOWAIT 将尝试在您的表上获取排他锁。检查@@error != 0,如果它没有这样做

标签: sap-ase


【解决方案1】:

锁定整个表格会起作用,但如果您只是在寻找更小粒度的页面(根据您的问题的标题),则非常粗糙。 实际上,您可以通过在 INSERT 之前执行 SET LOCK NOWAIT 然后检查@@ERROR 的状态代码 12205 来做到这一点,这表明为了执行插入操作需要锁定某些东西。不要忘记运行 SET LOCK WAIT 以恢复默认值,否则 NOWAIT 将应用于您的其余会话。

【讨论】:

  • 很好,不知道您可以为会话全局指定它,而且他们也会使用自己的锁定机制.. 很好!!
【解决方案2】:

试试:

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

【讨论】:

  • 我对 sybase 不熟悉,但是为了尝试检测是否会阻止更新/插入单个记录而必须锁定整个表似乎不是有点矫枉过正吗?
猜你喜欢
  • 1970-01-01
  • 2015-09-04
  • 1970-01-01
  • 2021-05-02
  • 1970-01-01
  • 1970-01-01
  • 2022-08-23
  • 1970-01-01
  • 2013-05-19
相关资源
最近更新 更多