问题标签 [database-locking]

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 投票
0 回答
56 浏览

java - 插入语句后的 Java SQLLite 数据库锁定

我有两个连接到数据库的客户端,一旦其中一个执行了插入查询,例如另一个下面的一个,则永远无法执行任何插入查询,但仍可以执行选择查询。任何想法如何两个客户可以插入?

0 投票
1 回答
746 浏览

mysql - 如何在 Mysql 中同时更新不同的行

我有一个大表,我必须在其中更新几行。我尝试使用多个线程同时更新不同的行,但似乎 MySql 锁定了表中的所有行,而不是只锁定那些与 'where' 子句匹配的行。因此更新不是并发的,有时会导致锁定超时错误。

有没有办法同时更新不同的行?

我在后端使用 Django 来执行更新操作。我可以切换到 Postgres,但它会有所帮助还是仍然存在锁定问题?

更新:添加代码片段:

更新:执行“显示引擎 innodb 状态;”

发现 Django 自动将隔离级别设置为 'READ-COMMITTED'。因此 MySql 只锁定那些需要更新的行。但是更新仍然没有同时发生,因为 2 个线程似乎在等待锁定,即使它们必须更新不同的行。

show engine innodb status;在并发更新操作期间做过。结果如下:

一段时间后再次运行命令

我无法理解为什么 2 个线程无法获得锁,因为它们将更新不同的行?它的解决方案是什么?

0 投票
0 回答
679 浏览

postgresql - 在插入分区表 postgres 期间锁定

插入期间是否可以排除约束?

当插入到 c1 值(1)时,它正在获取所有子项(c2,c3)上的 RowExclusive 锁

有没有办法在插入期间进行约束排除?或任何可用于执行此操作的提示

0 投票
1 回答
34 浏览

postgresql - Postgres:“FOR UPDATE OF table”检索的顺序

我想知道依靠FOR UPDATE OF <table>JOIN 时的数据一致性。我将尝试做一个简单的例子:

事务 1 执行:

事务 2 在以下情况下非常密切地执行此操作:

事务 2 是否有可能获得锁,但仍然过时b.val?锁在来自的行上a——它是否在从 检索行之前等待该锁b

0 投票
1 回答
6302 浏览

mongodb - MongoDB中的事务锁

我正在尝试开发一个预订系统,在检查其可用性后预订不同的资产。系统首先尝试从数据库中读取记录并检查被预订的插槽是否可用。如果是这样,系统通过将新记录插入系统来为他们预订插槽。

现在的问题是,如果有多个用户请求预订,并且由于对 db 的多个请求可以交错,这种情况就有可能发生。

为了避免这种情况,理想情况下我必须在读取操作开始之前获取集合级别的锁,并且只有在最终写入完成后才释放锁。

我的理解正确吗?如果是这样,这可以在 MongoDB 中完成吗?

非常欢迎使用 MongoDB、Mongoose 或@tsed/mongoose的任何解决方案。

0 投票
1 回答
183 浏览

php - 数据库锁和 Web 服务器如何在数据库会话方面协作?

这个问题的范围很广,例如 web 服务器、数据库服务器、php 应用程序等,因此我怀疑它是否属于 stackoverflow,但是由于这个问题将帮助我们如何编写应用程序代码,所以我决定问它这里。

我对数据库会话和 Web 服务器如何协同工作感到困惑。如果我是对的,当为客户端建立连接时,只会为该连接创建一个会话,并且该会话将持续到连接断开连接或由于长时间不活动而重新连接。

现在,如果我们考虑一个 Web 服务器,特别是 Apache 2.4 运行一个 PHP 7.2 应用程序(在虚拟主机中)和一个由 MariaDB 10.3.10 支持的数据库(如果这很重要的话,在 Fedora 28 上),我假设以下场景(请更正如果我错了,我):

  • 对于每个 Web 应用程序,现在我们使用 Laravel,只要第一个查询命中它所服务的 URL,就会建立一个数据库连接。
  • 随后,它将只有一个数据库会话。提供查询时,连接将保持活动状态,以供应用程序接收的其他查询重用。这意味着如果应用程序最有可能连续接收 24 x 7 的 Web 请求,连接也将保持活动状态,并且只有在我们重新启动 mysqld 或 httpd 时才会断开连接,这甚至可能在几个月内都不会发生。
  • 由于应用程序的所有用户,比如 20 个用户,使用相同的 Apache 服务器和 Laravel 应用程序文件(我假设我可以称之为应用程序实例)所有 20 个用户将通过相同的数据库连接提供服务和数据库会话。

如果上面提到的所有用例都是正确的,那么数据库锁定的概念似乎很混乱。假设我们会发布一个排他锁,例如lock tables t1 write;,它会阻塞其他会话的读写,以避免并发会话的脏读写操作。但是,由于所有 20 个用户同时使用相同的会话和连接,我们将无法从数据库锁定机制中获得所需的并发安全性。

问题:

  1. 数据库锁定、显式排他锁定在 Web 应用程序中如何工作?
  2. Laravel 应用程序收到的每个 Web 请求都会创建一个新的连接和会话,还是只重用一个连接和会话?
  3. 每个数据库连接一次是否只有一个会话?
  4. 此命令会显示当前活动会话或连接show status wherevariable_name= 'Threads_connected'吗?如果它显示当前活动连接,我们如何获得当前活动的数据库会话?
0 投票
1 回答
42 浏览

postgresql - 使用外键约束更新列是否可以锁定引用的表?

我有一张表,它在我的系统中由进程 A 大量更新。这是简化表:

我有一个引用该表的表:

我试图了解我是否employee_property通过系统中的进程 B 大量更新表,它是否会导致一些锁或任何其他可能影响更新员工表的进程 A 的副作用?

0 投票
1 回答
3647 浏览

database - PostgreSQL 错误:进程仍在等待数据库 0 的关系 2676 上的 AccessShareLock

我们无法连接到 PostgreSQL 实例,我们必须重新启动 PostgreSQL 服务才能连接到实例,但几天后我们开始收到同样的错误。

日志显示以下错误

当我检查服务状态时,它显示以下详细信息

我知道我需要检查数据库中的锁,但日志中提供的信息并不那么详细。PostgreSQL 系统表中没有 oid = 0 的数据库。

我该如何调试这个问题?

任何帮助,将不胜感激。

0 投票
1 回答
892 浏览

mysql - 添加外键时mysql中的死锁

我们的数据库中有一个名为的表company_competitors。有一项工作每天截断并加载此表。该表有两列company_id,并且competitor_id都引用另一个表companies

截断和加载中包含的步骤是:

  1. 创建一个新表company_competitors_new
  2. 在两列(company_idcompetitor_id)上一一添加外键约束。
  3. 将数据加载到新表中。
  4. 交换表company_competitorscompany_competitors_new.

查询:

"CREATE TABLE company_competitors_new LIKE company_competitors;

alter table company_competitors_new ADD CONSTRAINT fk_rails_company_id_53f8f57a foreign key (company_id) references companies(id);'

在添加外键时,其他人可能会访问公司表。因此,当第二个查询运行时,数据库陷入死锁,并且没有执行对公司表的查询。

show full processlist显示所有查询说Waiting to acquire Metadata lock,我必须杀死所有选择查询,以便添加外键完成。

我需要帮助来理解这里死锁的原因以及我该如何处理它。我还想知道是否有更好的方法来截断和加载 0 停机时间。

0 投票
2 回答
181 浏览

mysql - SQL 行锁和事务

我对关系数据库真的很陌生。我正在从事一个涉及财务的项目,因此我希望不会同时发生任何影响平衡的操作,并且我想使用锁来实现这一点,但是我不确定如何使用它们。我现在的愿景:我想为每个操作创建一个单独的表,并在 users 表中创建一个 balance 字段,其值将来自所有相关表。可悲的是,我实际上永远不会更新现有记录 - 只会添加它们。我想确保在这些表中一次只为每个用户插入一条记录。例如:3 个事务同时发生,因此 3 条记录将被添加到任何相关表中。其中两条记录具有相同的用户 ID,即我的 users 表的外键,另一条具有不同的。我希望将具有相同外键的记录流水线化,并且可以随时完成另一个记录。我如何实现这一目标?有没有更好的方法来解决这个问题?