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

如何检测锁定表格行的原因?

危寒
2023-03-14

我在Ubuntu 15.10和Freebsd上使用PHP 7 (5.6.11)和postgresql 9.4。

我的代码使用“for update”选项从表中按id选择单行。有时(数百个查询中的一个)此查询执行时间很长,大约20-90秒。我的代码在大约30个线程中工作。

据我所知,“从表中选择*进行更新”只锁定表中的单行,只有当另一个进程已经选择了这一行时,我才能得到这样的行为。我是对的吗?但是它不可能发生,因为脚本只有在从消息代理获取消息后才会执行。

单行的单个消息。所以我想象不出谁,为什么能挡住这一排。(< code > select * from table for update 用在一个地方,在那里我从队列中获取消息)。

我尝试使用来自pg_locks和ps ax输出的信息。我在选择更新之前保存此信息,然后,如果我捕获长查询,我会在日志中发送此信息。我看到了锁定表的进程 pid,但我在 ps ax 输出中没有看到这个 pid。这让我感到困惑。

有人知道吗?

共有2个答案

王旺
2023-03-14

不同的数据库产品使用完全不同的锁定机制。有些,当您执行选择*from table进行更新时,id=34可能会锁定一行或一个块。您需要阅读官方留档。

如果您在没有任何条件的情况下执行< code > select * from table for update ,您将锁定整个表,直到您< code>commit或< code>rollback为止

鲍永春
2023-03-14

我找到了理由。我使用自己的任务管理器来处理ActiveMQ。有时由于某些原因,任务管理器为某些类型的任务设置暂停。然后,在某个事件之后,任务被解除暂停并在队列中重新发送。包装在数据库和ActiveMQ事务中的重新发送。

为了使用ActiveMQ,我使用这个库:https://github.com/centraldesktop/php-stomp

对于发送消息,我使用了同步模式,我发现,我忘记了使用这种模式进行交易。因此,当任务在队列中重发时,第一条消息进入队列而没有事务,它们运行脚本……而这些脚本应该等到重发者完成重发任务并提交其数据库事务。

 类似资料:
  • 问题内容: 有没有一种方法可以检测MySQL中的锁定表?我的意思是表被命令锁定。 (请注意,有兴趣检测使用来获取的 命名 锁的读者应改为从get_lock显示显示所有当前锁。) 问题答案: 显示每个表的状态及其锁定。 对于命名锁,请查看显示来自get_lock的所有当前锁

  • 问题内容: 我有一张带桌子的桌子。 我需要访问并递增。 在访问期间,我需要锁定特定的用户行(而不是整个表)。 我该怎么做呢? 表格类型为。 问题答案: MySQL仅使用MyISAM表中的表级锁定。如果可以,请切换到InnoDB进行行级锁定。 这是指向MySQL网站的链接,该链接描述了由SQL语句为InnoDB表设置的锁。 http://dev.mysql.com/doc/refman/5.0/en

  • 问题内容: 我使用JDBC连接到Oracle表。(表1)仅执行插入操作,并且限制为:仅使用 “语句” 。 Java代码具有一个侦听器,用于侦听数据源。该数据被上载到表1,并且在表2读取表1的转换数据之后,要求使该过程接近实时。 我的问题:有没有一种方法可以找出表2正在访问(锁定)表1的时间,以便可以将数据保存在Java代码中。 问题答案: 首先,表不读取数据,某些“事物”必须从表1中读取数据并将其

  • 问题内容: 我正在尝试为我的工作场所建立一个更好的用户名/密码字段,并希望能够在他们的工作帽锁定时抱怨。 这可能吗?如果是这样,我希望在客户键入他们的第一个字母之前检测到它。 是否有非特定于平台的方式来做到这一点? 问题答案: 尝试从java.awt.Toolkit返回一个布尔值:

  • 主要内容:分配矩阵,请求矩阵如果在资源分配图中形成一个循环,其中所有资源都有单个实例,则系统将死锁。 在具有多实例资源类型的资源分配图的情况下,周期是死锁的必要条件,但不是充分条件。 以下示例包含三个进程P1,P2,P3和三个资源R2,R2,R3。 所有资源都有单个实例。 如果我们分析图表,那么我们可以发现图表中存在一个循环,因为系统满足所有四种死锁条件。 分配矩阵 分配矩阵可以通过使用系统的资源分配图来形成。 在分配矩阵中

  • 问题内容: 我正在调试运行多个线程的Java应用程序。在查看日志一段时间后,似乎这些线程之一不再运行。我的猜测是线程正在等待永远不会释放的锁(最后的输出是在调用同步方法之前)。 我可以配置线程超时吗?一种“等待此锁,但如果10秒钟后仍不可用,请不要再等待!” 问题答案: 您可以使用java.util.concurrent.Lock代替内部锁。没有合理顺序的RentrantLock具有与内部锁相同的