问题标签 [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 投票
0 回答
2466 浏览

c# - C# - 操作之间的实体框架锁定记录

我有一个实现实体框架 4.1 的应用程序,我为每个方法使用一个上下文实例

它工作正常,问题是应用程序是多用户并且他们可以修改相同的记录,我想防止一个用户更改其他用户正在修改的记录,直到更新记录

有什么方法可以做到这一点吗?

0 投票
1 回答
84 浏览

mysql - 哪些记录被 MySQL 的 'SELECT ... FOR UPDATE' 锁定

我已经阅读并测试了 MySQL 的 InnoDB 中的行级锁,但我仍然很难说“我知道 MySQL 中的锁是如何工作的”!

这是我的测试数据:

为了测试 MySQL 关于行级锁的行为,我打开了两个终端并连接到 MySQL。我要命名它们mysql1>mysql2>。这是我在第一个终端上执行的:

然后在第二个终端上:

令我惊讶的是,上面的查询将被第一个查询阻止!所以我回滚了第一个终端并重新开始:

然后在第二个终端上:

第二个终端再次被第一个终端阻塞!是否存在并非表的所有记录都被锁定的情况?如果不是,为什么这称为“行级锁定”?

0 投票
1 回答
3443 浏览

php - PHP - MySQL 行级锁定示例

我已经看到很多帖子解释了 Select FOR UPDATE 的用法以及如何锁定行,但是我无法找到任何解释当代码尝试读取被锁定的行时会发生什么的帖子。

例如。假设我使用以下内容:

在这种情况下,如何确定我的锁定是否成功?当行已被锁定时,处理场景的最佳方法是什么?

抱歉,如果在某处描述了这一点,但我似乎只能找到“快乐路径”的解释。

0 投票
1 回答
552 浏览

php - 行级锁定 - MySQL - 用于更新

我仍然对表行锁定感到困惑。我正在使用 MySQL/PHP,这是我的场景。

我有一组表,我的应用程序使用这些表来跟踪请求和帖子。用户为项目(表 ITEM (I))创建发布(表 POSTING (P))并且可以向单个用户发送请求(表 REQUEST (R))或者可以发布它并接收发布响应(表 POSTING_RESPONSE (PR )) 将被用户发布项目接受。

示例:我是骑自行车的用户。我发布它 - 并向个人用户发送请求。收到我的请求的用户可以接受/拒绝/或什么都不做。如果他们接受 - 它被保留。其他用户可以找到我的帖子并“申请”项目。我有能力“接受”或“忽略”他们的要求。如果我接受,则保留项目。

如果有人接受请求,我想做什么:

  1. 锁定ITEM(I)表中item对应的行

  2. 锁定 POSTING (P) 表中与项目对应的行(如果存在行)

  3. 为项目发送的任何请求锁定 REQUEST (R) 表中的行

  4. 锁定与项目对应的 POSTING_RESPONSE (PR) 表中的行(如果存在行)

  5. 将项目状态更新为“已保留”

  6. 将 POSTING 状态更新为“不可用”

  7. 将所有/任何 POSTING_RESPONSE 更新为“拒绝”

  8. 将所有请求更新为“已拒绝”,除了已接受的请求 - 将该请求更新为“已接受”

请忽略此示例的冗余状态。

现在,我假设 #1 - 4 可以通过简单的“选择...进行更新”来完成,而将 AUTOCOMMIT 设置为 false。我可以用这些选择语句来确定我是否应该更新——如果是这样,我可以继续更新。然后在完成更新 #5-8 后,我将提交并解锁行。

我在让它工作时遇到问题,我不知道是因为我正在做的事情还是我的想法不正确。

还有一件事......还有其他进程可以将项目的状态更新为,例如,EXPIRED 或 CANCELLED。我希望我的方法的唯一解决方案不是将每个可能的条件都放在 UPDATE 语句中的 WHERE 子句中……这不容易维护。

0 投票
3 回答
22583 浏览

c# - 如何在实体框架中完全锁定一行

我正在处理我们正在处理货币交易的情况。

例如,我有一张用户钱包表,他们的余额在该行中。

现在在我们的网站和网络服务中,每次发生特定交易时,我们需要:

  1. 检查是否有足够的资金来执行该交易:
  2. 从余额中扣除交易成本。

在我的整个交易期间如何以及如何锁定该行/实体的正确方法是什么?

从我读到的一些解决方案中,EF标记了一个实体,然后在将其保存回数据库时比较该标记,但是当另一个用户/程序已经编辑了该数量时它会做什么?

我可以用 EF 实现这一目标吗?如果不是,我还有什么其他选择?

调用存储过程可能允许我正确锁定该行,以便在程序 A 锁定该行时没有其他人可以访问 SQL Server 中的该行?

0 投票
1 回答
867 浏览

c# - (我的)用户输入数据时的SQL行锁定c#

我即将使用数据库创建一个应用程序,其中允许多个用户编辑有关实体的信息。

tldr:当用户在 C# 中编辑它的信息时,如何锁定数据库中的一行。

我对在执行查询时锁定数据库中的记录进行了一些研究。我主要看到的是用begin transactionand锁定commit transaction。但是,这不适合我的需要,因为它需要锁定比查询执行时间更长的时间。

如果 user1 正在编辑一条记录(在 c# 中,使用表单应用程序,填写一些文本框),那么我需要锁定该行,直到他完成编辑。因为同时 user2 可能会尝试编辑相同的记录。到 user1 完成时,一切都很好,但是当 user2 完成时,他会覆盖或返回有关他正在搜索的记录(名称)不再存在的错误。

一个简单的解决方案是添加一个带有 的列IsLocked,这取决于用户可以编辑一行。但是当由于某种原因应用程序崩溃或用户强制停止任务管理器中的进程时,该行将被永远锁定。(或者在发生这种情况时还有办法执行代码吗?)

另一种方法是执行不带commit transaction. 为此,我相信,您必须保持连接打开,否则它将终止。在运行应用程序时保持开放连接对我来说似乎不是一个好主意,或者是吗?

旁注:标题说(我的)sql,因为我不太确定我将使用哪一个。

谢谢你的时间!

0 投票
0 回答
99 浏览

mysql - 测试 MySQL/InnoDB 中行的锁定状态

我正在使用该SELECT ... FOR UPDATE语法在 MySQL 5.6 中保留多个 InnoDB 表的多行。这使我可以将并发写操作彼此隔离。

我很确定锁定是有效的,因为我可以证明一个并发事务被挂起,直到前一个事务完成。但这只是手动测试,因为它取决于时间。

现在我想写一些自动化测试。

是否有一个语句可以轻松测试某些行是否被锁定,或者是否有一个返回当前锁定行列表的语句?

0 投票
1 回答
1667 浏览

java - 多个JVM访问同一个数据库时如何在java中获取行级锁?

我在不同的 JVM 中运行相同应用程序的三个实例。我不希望数据库中的特定值同时被不同的应用程序修改。如何在 java 中强制执行此限制?

0 投票
1 回答
1171 浏览

mysql - MySql InnoDB 在事务中递增并返回一个字段

在我的应用程序中,我想从 InnoDB 表中获取一个值,然后在单个事务中递增并返回它。我还想锁定我要更新的行,以防止另一个会话在事务期间更改值。我写了这个查询;

我想知道隔离级别是否正确以及是否需要“FOR UPDATE”语句。我做对了吗?

0 投票
0 回答
95 浏览

php - 如何锁定相关行,以便对它们的任何选择将等到事务完成?

我正在构建一个游戏会话,每个会话都有许多状态。当游戏要求下一步时,选择当前游戏会话,然后选择最新的游戏状态。用户对状态执行操作,将其返回,与上一个状态进行检查,如果有效,则保存操作,创建新状态并将其返回给用户。这个过程重复。在游戏结束时,游戏会话被标记为结束,并创建一个新会话。

如果任何动作同时提交两次,它们都将能够获取相同的游戏会话,获取最新的游戏状态并针对该动作进行验证。该事务似乎只是阻止写入事务中修改的任何行。无论哪个第二个被击中,都会等到第一个完成,然后写入它的数据并创建下一个游戏状态。

我需要在游戏会话行上创建一个读锁,所以如果任何实例在某个事务中对游戏会话状态执行任何操作,任何其他读取游戏会话的尝试都将被延迟,直到该实例/事务完成,所以read 将始终在事务后获取数据。

我无法找出如何创建行读锁。有人可以帮助我吗?谢谢。

编辑:

我想我需要在事务中执行 SELECT 游戏会话行 FOR UPDATE,这将锁定该行以供读取,但是在事务之前我会有一个 SELECT 游戏会话行 LOCK IN SHARE MODE 以确保它等到它可以开始了吗?

不确定我是否正确使用了这些。

在我用 PDO 抽象的 PHP 代码中的某个地方(特别是 Eloquent):

这似乎有点多余。我知道事务隔离级别也有很多,虽然我不清楚这会在哪里绑定,是否需要 SERIALIZABLE?还是会弄乱“更新”位?