问题标签 [rowlocking]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2169 浏览

mysql - MySQL:INSERT 被外键引用行的 UPDATE 阻塞

让我从一个 SQL 示例开始我的问题。

这是表设置:

  1. 创建表xy. 与y.xx.id
  2. x在(id=1) 中插入一行。

现在启动一个事务 (Trx A) 来更新x.

在提交之前,我正在启动另一个事务(Trx B)以将一行插入到y.

问题是——预计 Trx B 届时会被绞死吗?为什么以及任何解决方法?

这已经在 MySQL 5.7.21、Percona 5.7.21、MariaDB 10.2.14 上进行了测试

0 投票
1 回答
1768 浏览

mysql - 表锁和行锁的区别

我正在研究 MySQL 及其工作原理,有些事情让我感到困惑,我在网上找不到任何明确的解释。

行锁和表锁到底有什么区别?一个锁定行,另一个锁定表。正确的?

那么,在哪种情况下你会使用表锁和行锁呢?它是程序员或数据库管理员可以编程的东西,还是它是为你做的?

如果您认为有任何其他信息值得了解,请随时将其添加到您的答案中。对于这个可能的问题,我很抱歉,但我仍在学习。

0 投票
0 回答
82 浏览

mysql - 权限系统上的行锁定问题

要求

我目前正在构建权限系统。要求之一是它是水平可扩展的。

为此,我们做了以下工作

有一个“已编译资源权限”表,如下所示:

该表的结构表示用户 1 可以访问资源 1 和 2,而用户 2 只能访问资源 1

“原因”列是一个按位数字,根据“为什么”他们拥有该权限,它的位被打开。二进制位“1”表示他们是管理员,二进制位“2”表示他们创建了资源。

所以用户 1 可以访问资源 1,因为他们是管理员。他有权访问资源 2,因为他是管理员并且他创建了该资源。如果他不再是管理员,他仍然可以访问工单 2,但不能访问工单 1。

为了弄清楚需要进入这个表的内容,我们使用了一个“修补程序”类,它以编程方式循环传递给它的用户和资源,并在逻辑上查看所有必要的数据库表,以确定需要添加哪些行以及需要从中删除哪些行桌子。

我们如何尝试扩展和问题

为了横向扩展,我们将逻辑拆分为块并将其提供给异步队列上的许多“工作人员”

这似乎只是在它不再加速之前扩展,有时甚至发生行锁定,这会减慢它的速度。

我们可以使用特定类型的行锁来允许它无限扩展吗?

我们是从完全错误的角度来处理这个问题吗?我们有很多“原因”和很多复杂的权限逻辑,我们需要能够相当快地重新编译

并发运行的 SQL 查询,供参考

当我们“添加”原因时:

当我们“删除”原因时:

0 投票
0 回答
1205 浏览

postgresql - 在 postresql 中实现工作队列

我想在 postgresql 中创建一个持久的作业队列。这样多个工作人员可以从队列中选择一项作业(使用select for updatewith skip locked),对其进行处理,然后将其从队列中删除。我有一张桌子:

现在,如果有两个工作,那么它工作正常:

启动worker1事务并选择第一个作业

开始处理。worker2做同样的事情并使用相同的查询选择第二个作业。

完成worker1工作后,将其从队列中删除并提交事务:

然后worker1它准备好接受新工作,所以它做同样的事情。开始新事务,选择未锁定的作业。但问题是,没有更多的工作,查询返回零行。

理想的情况是查询会阻塞,直到有新作业并返回结果。有可能吗?还是我走错了方向?

编辑:

工人是一个外部过程。因此,如果工作人员死亡,会话也会终止,事务也会终止。然后选定的作业将不再被锁定并准备好供其他工作人员使用。伪代码如下所示:

0 投票
0 回答
59 浏览

sql-server - SQL Server:在 UPDATE 上使用 ROWLOCK 和 OUTPUT

我有一个具有以下结构的表:

我使用存储过程将表的前 N ​​行(状态为“待处理”)更新为状态“处理中”并返回受影响的行。片段:

这按预期工作。现在,当我有多个运行上述 SQL 代码脚本的应用程序实例时,就会出现问题。

我需要确保没有 2+ 个实例在相同的数据上运行上述。

我可以简单地锁定表以进行操作,但将来我将在该表中拥有数千个条目,因此这会影响性能。

我一直在阅读 ROWLOCK ,它似乎符合我的要求,但我看到查询优化器忽略了 ROWLOCK (或提升为表锁)的帐户。

使用 ROWLOCK 是否适合我的用例?有没有更好的方法来解决这个问题?

0 投票
1 回答
82 浏览

mysql - Mysql 行锁定 - 性能问题

我们正在使用下面的更新查询,它使行锁定超过 3 分钟。请查看以下查询详情。



0 投票
1 回答
170 浏览

oracle - 查找锁定行的会话

我正在row lock contention我的 oracle 数据库中体验。我试图杀死一些会话来解锁它们,但这些行仍然被锁定。我确切地知道哪一行被锁定。我可以找到锁定该行的会话 ID。我可以得到ROWID那一排的。

0 投票
1 回答
40 浏览

database - postgresql db 表锁定或行锁定多查询执行

我想了解 postgreSQL 是如何执行多查询的,例如我有一个数据库,其中有很多插入查询运行,例如每分钟 20-40 和很多选择查询,如每分钟 200-300(通过主键进行简单查询选择)。

这种类型的查询在同一张表上运行,我很好奇 postgreSQL 是如何处理这些的。是否就像当插入查询运行时表被锁定并且我们必须等待选择查询或者它是行锁定以便在插入查询正在进行时选择查询可以继续并忽略锁定的行?

在 mysql 数据库中,我猜有执行表锁定的 MyISAM 引擎和执行行锁定的 innoDB...

0 投票
1 回答
256 浏览

mysql - 如何强制 MySQL 为事务获取表锁?

我正在尝试使用 InnoDB 存储引擎对 MySQL 数据库表执行操作。此操作是 INSERT 或 UPDATE 类型的操作,其中我有一组传入的数据,并且表中可能已经有一些必须更新的数据。例如,我可能有这张表:

...以及一些示例数据:

现在,我想“合并”以下值:

我的代码最终发出以下查询:

(我不确定 和 会发生什么,SELECT ... FOR UPDATE因为UPDATE我正在使用 MySQL 的用于 Java 的 Connector/J 库,并且只是updateRow在 a 上调​​用该方法ResultSet。为了争论,让我们假设上面的查询实际上是什么发给服务器。)

注意:上表是一个简单的例子来说明我的问题。真正的表比较复杂,我在执行时没有使用PK作为匹配的字段SELECT ... FOR UPDATE。因此,仅通过查看传入数据就不清楚是否需要插入或更新记录。必须咨询数据库以确定是否使用 INSERT/UPDATE。

上述查询大部分时间都可以正常工作。但是,当有更多记录要“合并”时,SELECT ... FOR UPDATEINSERT行可以交错,我无法预测是否SELECT ... FOR UPDATEINSERT将要发布以及以什么顺序发布。

结果是有时事务死锁是因为一个线程为UPDATE操作锁定了表的一部分并且正在等待表锁(对于INSERT,这需要主键索引上的锁),而另一个线程已经获得了一个主键的表锁(可能是因为它发出了INSERT查询),现在正在等待第一个线程持有的行锁(或者更可能是页级锁)。

这是代码中唯一更新此表并且当前没有获得显式锁的地方。UPDATE对比的顺序INSERT似乎是问题的根源。

我可以想到几种可能性来“解决”这个问题。

  1. 检测死锁(MySQL 抛出错误)并简单地重试。这是我目前的实现,因为这个问题有点罕见。它每天发生几次。
  2. 用于LOCK TABLES在合并过程之前和UNLOCK TABLES之后获取表锁。这显然不适用于 MariaDB Galera——我们未来可能会使用这个产品。
  3. 将代码更改为始终INSERT首先发出查询。这将导致首先获取任何表级锁并避免死锁。

#3 的问题在于它需要在一个已经相当复杂的方法中使用更复杂的代码(“合并”操作本质上是复杂的)。那个更复杂的代码也意味着查询的数量大约增加了一倍(SELECT以确定行 id 是否已经存在,然后,另一个SELECT ... FOR UPDATE/UPDATE来实际更新它)。该表存在合理数量的争用,因此我希望尽可能避免发出更多查询。

有没有办法强制 MySQL 在不使用的情况下获得表级锁LOCK TABLES?也就是说,如果我们搬到加莱拉,某种方式会奏效吗?

0 投票
0 回答
1740 浏览

sql-server - SQL索引选项Allow row lock,Allow page lock,应该设置on还是off?是否可以创建定期更新的索引?

我有一个非常重的基于更新事务的表

我正在使用索引来加快分页查询

然而,从表中读取的结果并不重要。我的意思是它不必完全更新

那么这些选项实际上是做什么的呢?我的意思是说如果我设置Allow row locks为 false 会发生什么?它会提高速度吗?

我可以让这样的索引定期更新而不是每次交易吗?

假设每 10 分钟更新一次索引而不是每个表更新事务,这可能吗?

在此处输入图像描述

这里是此类查询的实际执行计划

https://pastebin.com/Vuwirip9

微软 SQL 服务器 2017

谢谢你