我有一个功能,需要对多个大表执行长时间的更新。在更新过程中,一次需要锁定2-3个表。
由于并非所有表都需要同时锁定,因此理想情况下,我只想锁定当时正在更新的那些表,然后在完成后将其删除。
例如。
-- Lock first pair of tables
LOCK TABLE tbl1_a IN EXCLUSIVE MODE;
LOCK TABLE tbl1_b IN EXCLUSIVE MODE;
-- Perform the update on tbl1_a and tbl1_b
-- Release the locks on tbl1_a and tbl1_b
-- HOW???
-- Proceed to the next pair of tables
LOCK TABLE tbl2_a IN EXCLUSIVE MODE;
LOCK TABLE tbl2_b IN EXCLUSIVE MODE;
不幸的是,在plpgsql中没有等效的UNLOCK语句。删除LOCK的通常方法是提交事务,但这在函数内部是不可能的。
有什么解决办法吗?有什么方法可以在函数完成之前显式释放锁?还是运行某种子事务(也许通过在单独的函数中运行每个更新)?
更新
我接受没有解决方案。我将每个更新写入一个单独的函数中,并从数据库外部进行协调。谢谢大家。
有 没有办法 。Postgres中的函数是原子的(总是在事务内部),并且锁在事务结束时释放。而且,还没有自主交易。
您也许可以使用 咨询锁
来解决此问题。但是那些不是同一回事。所有竞争性交易都必须继续进行。不知道咨询锁定的并发访问将破坏该方。
dba.SE上的代码示例:
或者您重新评估您的问题并将其分解为几个单独的事务。
我对std::memory\u order\u acquire和std::memory\u order\u release的理解如下: Acquire意味着在Acquire fence之后出现的内存访问不能重新排序到fence之前。 释放意味着在释放栅栏之前出现的任何内存访问都可以重新排序为栅栏之后。 我不明白的是,为什么在C 11原子库中,获取界限与加载操作相关联,而发布界限与存储操作相关联。
我列出了一个有很多行的表,我想根据{transaction.to_address}值在每一行中使用一个新函数 我想在一个抓取函数中使用useeffect()函数,但是我得到了这个错误消息:渲染了比之前更多的钩子。我已经尝试了我在这里找到的许多解决方案,我已经花了几乎一整天,但我还不够聪明来修复它。 这类似于我的问题,但不适用于我 未捕获的固定冲突:渲染的钩子比上一次渲染期间更多
音乐播放器在没有外置存储器的智能手机上运行,应用程序会崩溃,而在有外置存储器的智能手机上运行。你能告诉我为什么。 Java类 activity XML listitem.xml 错误日志 谢谢你的帮助
我有一个Java堆转储,我想了解使用的堆的大小和可用的空闲内存。我正在使用Eclipse内存分析器。这可能吗?
问题内容: 我应该在将分配的字符串传递给之后释放它吗? 我有一些类似的代码: 在将字符串传递给之后释放字符串时,出现错误。如果我删除呼叫,该错误消失。我究竟做错了什么? 我看到矛盾的意见。有人说我应该自己释放它,有人说VM释放它,有人说VM不释放它,而您应该用奇怪的巫术魔术来释放它。我很困惑。 问题答案: 参数to 的存储完全由您负责:如果您分配了,则需要它。因此,您发布的代码段是正确的。您正在其
这是我的JSON文件,我需要从key:value pair中获取值,然后将这些值存储到ArrayList rating中进行排序,但使用这段代码,我只得到“reviews”作为键...你能帮我吗?我知道要得到所有的关键:值对,但我只需要一对,并从中取值。我应该为每个人使用迭代器吗?你能给我一些方向和例子吗
问题内容: 我正在使用以下功能下载小于20MB的文件。它将全部内容读取到内存中,因为另一个功能必须先对字节执行工作,然后才能将其写入磁盘。 这可以正常工作,但是所有内存都在系统上消耗了。 是否可以在其他功能处理完之后释放使用的内存,以使内存使用量不会大于当前正在处理的字节数? 问题答案: 您可能会触发gc使用释放未使用的对象,并且可能敦促Go运行时使用释放内存到OS ,但是所有这些都只是在扑救。编
问题内容: 我想从带有ctypes的C / C ++库中获取一些字符串到python中。我的代码如下所示: lib中的代码: Python代码: 如果我print()c_str,一切都在那里。问题是(或似乎是)在最后一行Python中。我无法释放内存- 库得到了错误的指针。我在这里做错了什么?(并且请不要建议boost :: python左右)。 问题答案: 正如David Schwartz指出的