加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

数据库 – 什么时候“选择更新”锁定和解锁?

发布时间:2020-12-12 08:39:39 所属栏目:MsSql教程 来源:网络整理
导读:这是我的伪代码: re = [select **result** from table where **condition**=key for update]if[re satisfies]{ delete from table where **condition** = key;}commit 我想询问条件是否等于“键”的行已经被删除了,可以自动解锁“选择更新”的锁定,这意味着
这是我的伪代码:
re = [select **result** from table where **condition**=key for update]

if[re satisfies]
{
    delete from table where **condition** = key;
}

commit

我想询问条件是否等于“键”的行已经被删除了,可以自动解锁“选择更新”的锁定,这意味着如果另一个进程在此处进入并选择相同的“密钥” “这不能被这个阻止吗?

解决方法

锁定在命令的执行期间(通常在或接近开始).锁定( advisory locks除外)仅在事务提交或回滚时才释放.没有FOR UNLOCK,也没有UNLOCK命令来反转表级LOCK命令的影响.这全部解释为 in the concurrency control section of the PostgreSQL documentation.

您必须提交或回滚事务以释放锁.

另外,询问“这行已经被其他并发事务删除”并不真实.在删除该行的事务提交之前,它不会被删除,甚至可能已经删除并重新插入该行,或者另一个并发事务可能再次插入该行.

您是否有机会构建任务队列或消息队列系统,因为如果是这样,那个问题就被解决了,你不应该尝试重新创建那个非常复杂的轮子.请参阅PGQ,ActiveMQ,RabbitMQ,ZeroMQ等(未来的Pos??tgreSQL版本may include FOR UPDATE SKIP LOCKED,因为这是在测试,但尚未在写作时发布).

我建议你发布一个新的问题,更详细的描述你正在解决的根本问题.你假设你的问题的解决方案是“找出行是否已被删除”或“解锁行”.这可能实际上并不是解决方案.有点像有人说“我在哪里买汽油”,当他们的推车不走,所以他们认为它的燃料.燃料不是问题,问题是推动自行车不要燃油,你必须踩踏它们.

解释背景.解释你想要实现的目标最重要的是,不要发布伪代码,发布您遇到问题的实际代码,最好是以独立和可运行的形式.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读