postgresql 事务隔离级别和锁定记录,请对正在运行事务中记录禁用SELECT

db2dz4w8  于 2022-11-04  发布在  PostgreSQL
关注(0)|答案(1)|浏览(125)

我可以**在事务内部使用的行上禁用SELECT*吗?
例如,表 * potatos * 中的行在事务1中被销毁,这需要很长时间。在事务2中,
potatos * 表上有SELECT*。我不想选择事务1中正在使用的那些记录。
因此,SELECT*马铃薯的结果是没有事务1中使用的记录。

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

我试图避免在数据库或Redis中标记。
我发现的事情:

*Rails中的事务级别

zzlelutf

zzlelutf1#

这是一个奇怪的要求。从逻辑上讲,直到您的事务完成后才会删除土豆-毕竟,您仍然可以回滚事务,然后它就不会发生了。重要的是事务的“逻辑顺序”,通常假设选择土豆的事务在逻辑上发生在删除事务之前没有错。
尽管如此,如果你仍然坚持自己的要求,下面是你可以做到的:
删除事务只是使用DELETE删除potato,但您使用修改后的查询来选择potato:

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

与常规的SELECT不同,此查询将在所选的每一行上放置一个SHARE锁。这样的锁不会相互冲突,因此多个这样的查询可以选择相同的土豆。
但是,该锁将与DELETEEXCLUSIVE行锁冲突,因此它不能选择这样的行。为了避免遇到这样的行时发生阻塞,可以添加SKIP LOCKED,如我的示例所示。
这一切都不是免费的:行锁修改表行,因此这样的查询将导致写入和读取。

相关问题