当前位置: 首页 > 知识库问答 >
问题:

解决死锁:并发事务调用存储函数插入/更新表

翟博雅
2023-03-14

当多个并发事务调用插入或更新表的存储函数时,我遇到了DEADLOCK情况。每个事务使用Postgres 10执行批量更新。

共有1个答案

权兴为
2023-03-14

通常,在所有并发事务中强制执行所有INSERTUPDATE 命令中的行顺序一致,可以完全避免死锁。

函数或无函数,这通常与死锁没有任何关系。事务在其生命周期中获得的锁越多,花费的时间越长,死锁的可能性就越大。“批量更新”是这里的主要嫌疑。可能需要为< code>UPDATE锁定的行...

相关:

  • 尽管ON冲突,但多行插入的死锁不做任何事情
  • 如何在PostgreSQL中模拟死锁?
  • 如何在PostgreSQL中使用带有ON CONFLICT的返回?

解决方案的详细信息取决于问题的未公开详细信息。

 类似资料:
  • 我在更新和插入查询之间的应用程序中遇到了死锁,我无法理解为什么以导致死锁的方式给出锁。 null 插入- null

  • 问题内容: 我一直在尝试解决我在Golang并发中遇到的这个简单问题。我一直在搜索所有可能的解决方案,但没有发现与我的问题有关的特定信息(否则我可能会被遗漏)。这是我的代码: 它显示错误: 致命错误:所有goroutine都在睡觉-死锁! goroutine 1 [chan接收]:main.main()D:/Code/go/src/testconcurrency/main.go:23 + 0xca

  • 主要内容:示例,死锁解决方案示例死锁描述了两个或多个线程等待彼此而被永久阻塞的情况。 当多个线程需要相同的锁定但以不同的顺序获取时,会发生死锁。 Java多线程程序可能会遇到死锁状况,因为关键字会导致执行线程在等待与指定对象相关联的锁定或监视时出现阻止情况。 看看下面一个例子。 示例 当您编译并执行上述程序时,会出现死锁情况,以下是程序生成的输出 - 上述程序将永久挂起,因为两个线程都不能继续进行,等待彼此释放锁定,所以您可以按

  • 分隔符$$CREATE PROCEDURE

  • 问题内容: 我有一个用@Transactional注释的方法。我从Oracle数据库检索一个对象,更改一个字段,然后从该方法返回。我忘了保存对象,但是发现无论如何都会更新数据库。 applicationContext 我的方法 我的问题是为什么MyObject会持久保存到数据库? 问题答案: 因为hibernate将自动检测对 持久性 实体所做的更改并相应地更新数据库。hibernate参考手册的

  • 我有一个包含两列的表:k(主键)和value。我想: 选择k进行更新,如果找不到k,则插入默认值的新行。 对返回的值(存在的或新插入的行值)进行一些处理。 更新行并提交。 是否可以使此“选择更新并在未找到时插入默认值”? 如果将(1)实现为select/check if found/insert if not found,我们会遇到并发问题,因为两个会话可能会在不存在的键上并发地进行选择,两个会话