Can I disable SELECT
在事务内部使用的行上?
例如,表中的行potatoes在事务 1 中被销毁,并且需要很长时间才能销毁。在交易2中,有SELECT*
on the potatoes桌子。我不想选择事务 1 中正在使用的那些记录。
所以,结果为SELECT*
土豆没有事务 1 中使用的记录。
Is 可串行化的隔离级别适合事务 1,因此事务 2 无法选择这些行?
或者我需要用一些东西来锁定这些记录锁定模式?
我试图避免数据库或 Redis 中的标志。
我发现的东西:
-
交易水平在 Rails 中 https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/DatabaseStatements.html#method-i-transaction
-
PostgreSQL 中的事务级别 https://www.postgresql.org/docs/current/transaction-iso.html
-
悲观锁在 Rails 中 https://api.rubyonrails.org/classes/ActiveRecord/Locking/Pessimistic.html
这是一个奇怪的要求。从逻辑上讲,在您的事务完成之前,土豆不会被删除——毕竟,您仍然可以回滚事务,然后它就从未发生过。重要的是逻辑顺序交易,并且通常假设选择土豆的交易在逻辑上发生是没有问题的before删除交易。
话虽如此,如果您仍然坚持自己的要求,可以按以下方法操作:
删除交易只是简单地使用删除土豆DELETE
,但是您使用修改后的查询来选择土豆:
SELECT /* whatever */
FROM potatoes
WHERE /* condition */
FOR SHARE OF potatoes SKIP LOCKED;
与普通的不同SELECT
,这个查询将放置一个SHARE
锁定所选的每一行。这样的锁不会相互冲突,因此多个这样的查询可以选择相同的土豆。
但是,锁会与EXCLUSIVE
的行锁DELETE
,因此它无法选择此类行。为了避免遇到这样的行时阻塞,您添加SKIP LOCKED
就像我的例子一样。
所有这一切都不是免费的:行锁会修改表行,因此此类查询将导致写入和读取。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)