gpt4 book ai didi

ruby-on-rails - 事务隔离级别和锁定记录,对正在运行的事务中的记录禁用 SELECT

转载 作者:行者123 更新时间:2023-11-29 11:48:51 25 4
gpt4 key购买 nike

我可以禁用 SELECT 在交易内部使用的行上吗?

例如,potatoes 表中的行在事务 1 中被销毁,并且需要很长时间才能完成。在事务 2 中,potatoes 表上有 SELECT*。我不想选择那些正在事务 1 中使用的记录。

因此,SELECT* potatoes 的结果没有事务 1 中使用的记录。

隔离级别可序列化是否适合事务 1,因此事务 2 无法选择这些行?或者我需要用一些锁定模式锁定这些记录?

我试图避免在数据库或 Redis 中使用标志。

我发现的东西:

最佳答案

这是一个奇怪的要求。从逻辑上讲,在您的事务完成之前,土 bean 不会被删除——毕竟,您仍然可以回滚事务,然后它就再也没有发生过。重要的是交易的逻辑顺序,通常假设选择土 bean 的交易在逻辑上发生在删除交易之前并没有错。

综上所述,如果您仍然坚持自己的要求,可以按照以下方法进行操作:

删除事务只是使用 DELETE 删除土 bean ,但您使用修改后的查询来选择土 bean :

SELECT /* whatever */
FROM potatoes
WHERE /* condition */
FOR SHARE OF potatoes SKIP LOCKED;

与常规 SELECT 不同,此查询将在每个选定行上放置一个 SHARE 锁。这样的锁不会相互冲突,所以多个这样的查询可以选择相同的土 bean 。

但是这个锁会和DELETEEXCLUSIVE行锁冲突,所以不能选中这样的行。为避免在遇到此类行时阻塞,您可以像我的示例一样添加 SKIP LOCKED

所有这一切都不是免费的:行锁修改表行,因此此类查询将导致写入和读取。

关于ruby-on-rails - 事务隔离级别和锁定记录,对正在运行的事务中的记录禁用 SELECT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58513053/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com