我可以**在事务内部使用的行上禁用SELECT
*吗?
例如,表 * potatos * 中的行在事务1中被销毁,这需要很长时间。在事务2中, potatos * 表上有SELECT*
。我不想选择事务1中正在使用的那些记录。
因此,SELECT*
马铃薯的结果是没有事务1中使用的记录。
隔离级别可序列化是否适合事务1,因此事务2不能选择这些行?或者我需要使用某种锁定模式锁定这些记录?
我试图避免在数据库或Redis中标记。
我发现的事情:
*Rails中的事务级别
我可以**在事务内部使用的行上禁用SELECT
*吗?
例如,表 * potatos * 中的行在事务1中被销毁,这需要很长时间。在事务2中, potatos * 表上有SELECT*
。我不想选择事务1中正在使用的那些记录。
因此,SELECT*
马铃薯的结果是没有事务1中使用的记录。
隔离级别可序列化是否适合事务1,因此事务2不能选择这些行?或者我需要使用某种锁定模式锁定这些记录?
我试图避免在数据库或Redis中标记。
我发现的事情:
*Rails中的事务级别
1条答案
按热度按时间zzlelutf1#
这是一个奇怪的要求。从逻辑上讲,直到您的事务完成后才会删除土豆-毕竟,您仍然可以回滚事务,然后它就不会发生了。重要的是事务的“逻辑顺序”,通常假设选择土豆的事务在逻辑上发生在删除事务之前没有错。
尽管如此,如果你仍然坚持自己的要求,下面是你可以做到的:
删除事务只是使用
DELETE
删除potato,但您使用修改后的查询来选择potato:与常规的
SELECT
不同,此查询将在所选的每一行上放置一个SHARE
锁。这样的锁不会相互冲突,因此多个这样的查询可以选择相同的土豆。但是,该锁将与
DELETE
的EXCLUSIVE
行锁冲突,因此它不能选择这样的行。为了避免遇到这样的行时发生阻塞,可以添加SKIP LOCKED
,如我的示例所示。这一切都不是免费的:行锁修改表行,因此这样的查询将导致写入和读取。