问题标签 [table-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 投票
1 回答
8130 浏览

entity-framework - 在实体框架中使用选择锁定表

我需要做这样的事情

使用实体框架。这可能吗?我TransactionScopeSerializable隔离级别打开了一个,但我的选择没有锁定表。我希望他们锁定,直到我完成交易范围。

0 投票
3 回答
2528 浏览

sql-server - 如何让 SQL Server 事务使用记录级锁?

许多年前,我们有一个最初是作为桌面应用程序编写的应用程序。每当您打开编辑屏幕时,它都会启动一个事务,并在您单击确定时提交,或者在您单击取消时回滚。这对于桌面应用程序来说工作得很好,但现在我们正试图迁移到 ADO.NET 和 SQL Server,长时间运行的事务是有问题的。

我发现当多个用户都试图同时编辑(不同的子集)同一个表时,我们会遇到问题。在我们的旧数据库中,每个用户的事务都会为他们在事务期间修改的每条记录获取记录级锁;由于不同的用户正在编辑不同的记录,每个人都有自己的锁,一切正常。但是在 SQL Server 中,一旦一个用户在事务中编辑了一条记录,SQL Server 似乎就会锁定整个表。当第二个用户尝试编辑同一个表中的不同记录时,第二个用户的应用程序只是锁定,因为 SqlConnection 阻塞,直到第一个用户提交或回滚。

我知道长时间运行的事务是不好的,而且我知道最好的解决方案是更改这些屏幕,以便它们不再长时间保持事务打开。但由于这将意味着一些侵入性和风险的更改,我还想研究是否有办法让这些代码按原样启动和运行,以便我知道我的选择是什么。

如何在 SQL Server 中获取两个不同用户的事务来锁定单个记录而不是整个表?

这是一个快速而肮脏的控制台应用程序,说明了这个问题。我创建了一个名为“test1”的数据库,其中一个名为“Values”的表只有 ID (int) 和 Value (nvarchar) 列。如果您运行该应用程序,它会要求修改 ID、启动事务、修改该记录,然后让事务保持打开状态,直到您按 ENTER。我希望能够

  1. 启动程序并告诉它更新 ID 1;
  2. 让它得到它的交易并修改记录;
  3. 启动程序的第二个副本并告诉它更新 ID 2;
  4. 让它能够在第一个应用程序的事务仍然打开时更新(和提交)。

目前它在第 4 步冻结,直到我返回应用程序的第一个副本并关闭它或按 ENTER 以提交。对 command.ExecuteNonQuery 的调用会阻塞,直到第一个连接关闭。

以下是我已经尝试过的一些事情,但行为没有改变:

  • 将事务隔离级别更改为“未提交读取”
  • 在 UPDATE 语句中指定“WITH (ROWLOCK)”
0 投票
1 回答
4860 浏览

ruby-on-rails - Rails 运行多个延迟作业 - 锁定表

嘿。我使用delayed_job 进行后台处理。我有 8 个 CPU 服务器,MySQL,我启动了 7 个延迟作业进程

Q1: 我想知道是否有可能 2 个或更多延迟作业进程开始处理同一个进程(数据库延迟作业中的同一记录行)。我检查了delayed_job 插件的代码,但找不到应有的锁定指令(没有锁定表或SELECT...FOR UPDATE)。

我认为每个进程都应该在 lock_by 列上执行 UPDATE 之前锁定数据库表。他们只需通过更新locked_by 字段来锁定记录(UPDATE delayed_jobs SET locked_by...)。真的够了吗?不需要锁吗?为什么?我知道 UPDATE 比 SELECT 具有更高的优先级,但我认为这在这种情况下没有效果。

我对多线程情况的理解是:

我认为在某些情况下,更多的工作可以获得相同的信息并可以开始处理相同的流程。

Q2: 对于 8CPU 的服务器来说,7 个延迟作业是一个好的数字吗?为什么是/不是。

谢谢 10 倍!

0 投票
1 回答
1219 浏览

mysql - MySQL 锁定表会影响相关视图吗?

因此,在阅读了 PDO / PHP / MySQL 中的性能:关于性能问题的事务与直接执行之后,我正在考虑我对 MySQL 中的锁定表进行了一些研究。

http://dev.mysql.com/doc/refman/5.0/en/table-locking.html

表锁定使许多会话可以同时从一个表中读取,但是如果一个会话想要写入一个表,它必须首先获得独占访问。在更新期间,想要访问此特定表的所有其他会话必须等到更新完成。

这部分让我印象特别深刻,因为我们的大多数查询都是更新而不是插入。我想知道是否有人创建了一个名为 foo 的表,在该表上执行了所有更新/插入,然后创建了一个名为 foo_view 的视图(foo 的副本,或者可能是 foo 和其他几个表加上 foo 的链接),所有选择都发生在该表上,这个锁定问题还会发生吗?

也就是说,对 foo_view 的 SELECT 查询是否仍需要等待对 foo 的更新完成?

我的同事又问了一个简短的问题。这会影响缓存吗?即,如果 SELECT 被缓存,它会命中缓存并返回结果,还是会等待锁先完成?

0 投票
1 回答
669 浏览

php - 是否可以选择...进行更新,进行电子商务交易,然后在 PHP 中调用 MySQL 存储过程?

我目前正在为我的客户构建一个 PHP 电子商务网站。它进展顺利,但我遇到了障碍,想知道是否有任何 MySQL/PHP 专家可以帮助我。基本上,电子商务网站只销售一次产品(意味着每件商品只有一个数量的库存),这意味着一旦客户签出该商品,就无法再购买。

所以在结帐时,我必须检查产品是否仍有库存。假设这将是一个流量很大的网站,可能会有两个或多个客户同时尝试结账的情况,因此他们都可以购买产品。所以为了防止这种情况,我的计划如下:

  1. 在产品上选择...FOR UPDATE,以锁定表行。
  2. 进行电子商务交易(Paypal、authorize.net 等)
  3. 电商交易成功,调用MySQL存储过程(也有SQL交易)来存储订单信息等,失败则回滚

这个计划有可能实现吗?要执行 SELECT...FOR UPDATE,我必须启动一个 SQL 事务,但随后我还要在 MySQL 存储过程的第 3 步中启动另一个事务。我不确定会发生什么。另外,这个计划会导致僵局吗?

抱歉,问题很长,但感谢您的帮助!

0 投票
3 回答
21967 浏览

performance - SQL Server - 合并大表而不锁定数据

我有一组非常大的数据(约 300 万条记录),需要按每日计划与更新和新记录合并。我有一个存储过程,它实际上将记录集分解为 1000 个记录块,并将MERGE命令与临时表一起使用,以避免在数据更新时锁定活动表。问题是它并没有完全帮助。该表仍然“锁定”,并且我们使用数据的网站在尝试访问数据时会收到超时。我什至尝试将它分成 100 个记录块,甚至尝试WAITFOR DELAY '000:00:5'看看它是否有助于在合并块之间暂停。它仍然相当缓慢。

我正在寻找有关如何在不锁定表的情况下合并大量数据的任何建议、最佳实践或示例。

谢谢

0 投票
5 回答
30477 浏览

mysql - 为什么大表的表级锁定优于行级锁定?

根据MySQL 手册

对于大表,表锁往往比行锁好,

为什么是这样?我认为行级锁定更好,因为当您锁定更大的表时,您将锁定更多数据。

0 投票
3 回答
3499 浏览

database - 如何锁定数据库表或一系列行进行写入?

我有一个带有主键的简单表。大多数读取操作通过键的确切值获取一行。

每一行中的数据在键顺序中与它之前和之后的行保持某种关系。所以当我插入一个新行时,我需要读取它要进入的 2 行,进行一些计算然后插入。

显然,问题在于,同时另一个连接可能会在同一时间间隔内添加具有键值的行。如果它与第二次插入失败的键值完全相同,我会被覆盖,但如果键值不同但在相同的时间间隔内,则关系可能会被破坏。

解决方案似乎是在我决定添加新行时锁定整个表以进行写入,或者(如果可能的话,我怀疑)锁定键值的间隔。然而,我更希望那时只读事务不会被阻止。

我在客户端程序和 IBM DB2 免费版中使用带有libodbc++ 包装器的ODBC(尽管 DB 选择可能仍会改变)。这就是我想做的事情:

  • 以自动提交和默认隔离模式启动连接
  • 当需要添加新行时,将 auto-commit 设置为 false 并将隔离模式设置为 serialized
  • 读取新键值前后的行
  • 计算并插入新行
  • 犯罪
  • 返回到自动提交和默认隔离模式

这会做这项工作吗?是否允许其他事务同时读取?还有其他/更好的方法吗?

顺便说一句,我没有在 libodbc++ i/fa 中看到指定只读事务的方式。在odbc中可以吗?

编辑:感谢非常有用的答案,我很难选择一个。

0 投票
4 回答
100060 浏览

mysql - 在没有表锁定的巨大 MySQL 生产表上创建索引

我需要在 ~5M 行 MySQL 表上创建索引。它是一个生产表,如果我运行 CREATE INDEX 语句,我担心会出现所有内容的完整块......

有没有办法在不阻塞插入和选择的情况下创建该索引?

只是想知道我不必停下来,创建索引并重新启动我的系统!

0 投票
2 回答
7490 浏览

mysql - 处理 ON INSERT 触发器时如何锁定 innodb 表?

我有两个 innodb 表:

文章

选票

将新记录插入votes表中时,我想通过计算所有投票的总和来更新表中的sum_votes字段。articles

问题

如果 SUM() 计算本身非常繁重(votes表有 700K 记录),哪种方式更有效。

1. 创建触发器

2. 在我的应用程序中使用两个查询

第一种方法看起来更干净,但是表会在 SELECT 查询运行的整个过程中被锁定吗?