问题标签 [record-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 投票
3 回答
981 浏览

asp.net - 在 ASP.NET 中存储记录锁定令牌

在我目前正在处理的应用程序中,多个用户可能想要同时编辑某些内容,这意味着我们需要实现乐观锁定。但是,对于此应用程序,正在编辑的项目是一个科学协议,其中包含来自数据库中多个不同表的记录。

因此,我们希望能够表明整个协议已被锁定以供单个用户编辑,这导致了我的问题:这样做的首选方法是在数据库级别进行编辑(例如,有一个表协议的唯一 ID 并检查它是否已被锁定)或者是否可以接受在内存中跟踪 Web 服务器本身上当前锁定的协议?

目前,我们预计该应用程序只有大约 100 个用户(大约 20 个同时使用),但这个数字在未来可能会增加,因此我们正在寻求使用最具可扩展性的选项。

0 投票
4 回答
331 浏览

mysql - 为什么这个查询很慢?我应该在这里使用 MyISAM 而不是 InnoDB 吗?

在我的慢查询日志中,我每小时大约会收到 5 次这些:

record_lock 表当前使用 InnoDB,它现在有不到十几个记录。

我们的系统中有几千个活跃用户。每次他们编辑一条记录时,我们都会插入到这个表中。在系统中任何地方的每个页面加载时,我们 1)从表中选择以查看当前用户是否有任何锁,以及 2)如果有用户的任何记录,则对该表运行 DELETE 查询,引用WHERE 子句中的表的主键。

这是表的架构:

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 回答
232 浏览

transactions - 当我们已经有在线订购的交易时,我们是否需要记录级别锁定?(演唱会门票或机票预订)

对于在线订购音乐会座位或机票,我们需要记录级别锁定还是交易足够好?

对于演唱会门票(比如说,20B 号座位),或者机票(例如超额预订,限制是 210,例如),我认为网站在显示购票屏幕时无法锁定任何记录或开始交易。

但是用户点击“Confirm Purchase”后,服务器应该Begin a Transaction,Purchase Seat Number 20B,并尝试Commit。

如果另一个用户在之前的交易中已经购买了Seat 20B,那么当前交易会失败的是“提交”部分吗?

所以...我们不需要记录级别锁定?事务是否总是序列化(一个接一个),这就是为什么我们可以确定没有“竞争条件”的原因?那么在什么情况下需要记录级别锁定呢?

0 投票
3 回答
8006 浏览

asp.net - 当两个成员试图访问记录时如何锁定记录?

我有这样的场景,

我的环境是.Net2.0,VS 2008,Web Application

当两个成员同时尝试访问时,我需要锁定记录。

我们可以通过两种方式

  1. 通过前端(将 sessionID 和记录唯一编号放入字典中并将其保存为静态或应用程序变量),当响应离开该页面,客户端未连接时,单击 post 按钮后,我们将释放会话结束。

  2. 通过后端(数据库本身的记录锁定 - 需要研究 - 我的团队成员正在寻找)。

还有其他方法吗?我是否需要在每个步骤中查看其他方法?

我是否缺少任何条件?

0 投票
0 回答
174 浏览

php - 在 flex 或 zend amf 中记录锁定

您如何处理具有多个用户的 flex (flash builder 4) 应用程序中的记录锁定?

它使用 zend amf 与数据库(mongodb 或 mysql)对话。

例如,如果用户 1 加载一个客户记录进行编辑,而用户 2 加载相同的客户记录进行编辑,那么如果用户 1 保存他们的编辑然后用户 2 保存他们的编辑 - 不知道用户 1 正在编辑,则会丢失数据.

我想我可以通过使用锁定标志或锁定表来实现我自己的系统,并且当打开记录时,检查锁定/设置锁定。但是,我希望已经有一些人们用来做这件事的东西经过测试/证明。

0 投票
3 回答
1325 浏览

php - 锁定MySQL中的最大值

我正在使用 PHP 在 MySQL 上使用以下查询

表 CART 的结构是

CART (SrNo int(10));

现在我正在使用结果进行某种处理,并通过递增一个将最大值插入到该表中。我的问题是,如果 user1 获得了最大值SrNo并且在处理之间。在此期间,user2 还请求服务器获得与 user1 获得的相同的 SrNo 最大值并开始处理。

现在,当两者都完成了处理+插入到表中时,我将在表 CART 中有两个重复项。我怎样才能防止这种情况发生?

换句话说,我不希望其他人获得 until 的最大值,SrNo除非一个用户完成了它的处理。

0 投票
7 回答
2485 浏览

c# - 为用户锁定 asp.net 中的页面

我正面临锁定asp.net 页面的问题。我们有一个用户个人资料页面,我们需要为首先打开它的用户锁定该页面。详细信息如下,数据库中有许多用户配置文件记录,我们将记录号传递给查询字符串以打开特定页面。用户单击网格中的链接按钮并以只读模式打开记录。有一个编辑按钮,可以启用所有控件,并在用户单击它后使其可供用户使用。任务是将记录锁定给首先单击编辑按钮的用户。

除此之外,还有许多场景,例如用户可能从页面导航,或者他可能会在两者之间关闭页面。在这些情况下,记录应该可供其他用户使用。请给我一些可能的方法或如何解决该场景的示例。

提前致谢

0 投票
1 回答
2133 浏览

api - Salesforce:记录被时间相关的工作流锁定

我们目前正在将 Salesforce 用于我们的销售流程,这涉及尝试让人们注册我们的“帐户管理系统”、提交详细信息、文档并获得管理员的审查。这是一个在 SF 之外的完整 PHP 系统,我们称之为“Cherry”。

我们现在正在做的是:Cherry 会跟踪客户,但发生的所有事情都会发送给 SalesForce,因此我们的销售人员有要联系的潜在客户列表。当 Cherry 中发生任何变化时,SalesForce 中的内容都会得到更新,包括在 Cherry 中的管理员审核客户时将 SF Lead 转换为帐户。(在此之后我们仍然更新 SF 数据,但这不太重要,因为这已经是客户了)

要将信息从 Cherry 发送到 SF,我只需使用“SforceEnterpriseClient.php”API 库,并调用该库提供的 Create/Update/Delete 方法。我不知道是否还有其他诚实的方式,但我们的需求非常简单。只需创建潜在客户、更新其字段并将其转换为客户。

我的问题是我们的销售人员希望使用与时间相关的工作流程,每隔几天自动向潜在客户发送电子邮件,将它们从一种状态更改为另一种状态,等等。但是,一旦潜在客户被这些工作流程之一“接受”,记录被锁定(直到执行操作的时间,通常是很多天),并且我尝试通过 API 对其进行的任何操作(更新它,或者特别是“convertlead”)都失败,并出现错误 RECORD_IN_USE_BY_WORKFLOW。

现在,这似乎是一个非常常见的场景(既使用 API 更新记录,又使用时间相关的工作流)。事实上,在我们的销售人员看来,使用 SalesForce 的全部意义在于工作流,所以我很惊讶,因为它失败了……

所以基本问题是.... - 这个问题有什么明显的方法吗?(使用其他一些 API?对工作流程做一些不同的事情?)
- 如果没有,有没有办法从其工作流程中“分离”潜在客户?(或以某种方式解锁该记录)
- 如果没有,是否有任何变通办法意味着在销售队伍方面进行更多编程?

非常感谢您的帮助丹尼尔

0 投票
2 回答
828 浏览

sql-server-2005 - SQL Server 功能 - 防止重复

我有一个 SQL Server 2005 数据库。Table A其中有一个标识列以及另一个Id跨越多行的手动列。第二id列的格式为,'0000000098'并且必须是字符串。我无法更改数据类型。

Function A获取最大ID列值,将其加一,转换为字符串。

我的存储过程获取新 ID,然后使用此 ID 进行多次插入。

如何防止两个客户端在更新发生之前运行存储过程并获得相同的 ID?我可以从读取中锁定表 a 直到 proc 完成处理还是有更有效的方法?

如果我可以更改数据类型和/或结构,那将很容易,但我不能。