标签: record-locking

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

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

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

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

asp.net asp.net-mvc concurrency record-locking

3
推荐指数
1
解决办法
966
查看次数

如何让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的调用将阻塞,直到第一个连接关闭.

public static void Main()
{
    Console.Write("ID to update: ");
    var id = int.Parse(Console.ReadLine());
    Console.WriteLine("Starting transaction");
    using (var scope = new TransactionScope())
    using (var connection = new SqlConnection(@"Data Source=localhost\sqlexpress;Initial Catalog=test1;Integrated Security=True"))
    {
        connection.Open();
        var command = connection.CreateCommand();
        command.CommandText = "UPDATE [Values] SET Value = 'Value' WHERE ID = " + id;
        Console.WriteLine("Updating record");
        command.ExecuteNonQuery();
        Console.Write("Press ENTER to end …
Run Code Online (Sandbox Code Playgroud)

sql-server transactions nonblocking record-locking table-locking

3
推荐指数
1
解决办法
2451
查看次数

当两个成员试图访问它时如何锁定记录?

我有这样的场景,

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

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

我们可以用两种方式做到,

  1. 通过前端(将sessionID和记录唯一编号放在字典中并将其保留为静态或应用程序变量),我们将在响应退出该页面时释放,客户端未连接,单击后发布按钮后会议结束了.

  2. 通过后端(记录锁定在DB本身 - 需要学习 - 我的团队成员正在寻找).

还有其他方法可以做,我需要在每个步骤中查看其他方法吗?

我错过了任何条件吗?

sql-server asp.net record-locking

3
推荐指数
1
解决办法
6345
查看次数

Laravel 5记录编辑签入/签出功能(锁定)

我正在使用Laravel 5.1并尝试在用户打开记​​录编辑视图时实现记录锁定,以便任何其他用户无法打开同一记录的编辑视图,直到锁定被释放.

很明显,用户永远不会完成编辑,因此我需要能够自动解锁记录(当用户进行任何其他事务时,或者在超时事件之后,或者使用ajax后台保持活动状态).

我已经查看了lockForUpdate()有关InnoDB锁定功能的内容,但我无法获得有关它的真实信息(搜索超过20个帖子,他们似乎都没有真正的信息相互背诵).文档也没有提供太多信息,探索Laravel Query Class代码让我获得了以下进展:

  1. 头痛.
  2. 我意识到它只在查询生成器中可用(我需要它用于Eloquent).
  3. 看起来它只是一个跨国锁定而不是签入/结账记录锁定.

看起来术语和mysql(innodb)锁定实际上存在很大的混淆,或者它可能只是我试图解决这个问题.

长话短说,InnodDB/Laravel锁定的主要警告(根据我的需要)是它不持久,因此当php脚本终止并且用户仍在编辑表单时它将自动重置.它仅适用于交易.

我需要实现上述功能(编辑签入/签出),在我重新发明轮子之前,我很想知道是否已经内置了Laravel/PHP功能.

如果没有,我正在考虑以下方法,并希望得到关于哪一个是最好的输入.

A. edit_checkins使用record_id,user_id,timestamp 创建一个表.

B. locked_at在记录表中添加一个列,该列将保存时间戳或null(类似于deleted_at列).

我主要担心的是性能和"垃圾收集",因为有时候记录被锁定但从未主动解锁.使用方法AI可以edit_checkins在简单查询中从表中删除所有用户锁.但是在检查记录是否被锁定时会慢一点,因为我必须进行表连接(我认为它应该可以忽略不计,因为编辑事件比其他事件更少).使用方法B检查更快但我没有获得所有信息(例如user_id)并且在不知道user_id的情况下实现解锁所有事件更难以几乎不可能(我可能需要locked_by同时在记录中添加一列).

我希望我的问题足够清楚.感谢您的时间.

php mysql record-locking laravel

1
推荐指数
1
解决办法
2694
查看次数

Salesforce:记录被依赖于时间的工作流程锁定

我们目前正在为销售流程使用Salesforce,其中包括尝试让人们注册我们的"帐户管理系统",提交详细信息,文档并获得管理员的审核.这是SF之外的整个PHP系统,我们称之为"Cherry".

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

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

我的问题是,我们的销售人员希望使用与时间相关的工作流程,每隔几天自动通过电子邮件发送潜在客户,将其从一种状态更改为另一种状态,等等.但是,一旦Lead被其中一个工作流程"抓住",记录被锁定(直到动作执行的时间,通常是很多天),我尝试通过API(更新它,或特别是"convertlead")的任何操作都会失败并显示错误RECORD_IN_USE_BY_WORKFLOW.

现在,这似乎是一个非常常见的场景(使用API​​更新记录,并使用时间相关的工作流).事实上,对我们的销售人员来说,使用SalesForce的全部意义似乎是工作流程,所以我很惊讶基本的东西,因为这失败了......

所以基本的问题是...... - 这个问题有没有明显的方法?(使用其他一些API?做一些与工作流程不同的事情?)
- 如果没有,是否有任何方法可以将Lead从其工作流程中"分离"?(或以某种方式解锁该记录)
- 如果没有,是否有任何变通方法暗示SalesForce方面的更多编程?

非常感谢你的帮助丹尼尔

api workflow salesforce record-locking

0
推荐指数
1
解决办法
1857
查看次数