javascript - 使用 jQuery 和 ajax 尝试写入锁定记录的最佳方法?

标签 javascript jquery .net ajax multithreading

我们有一个桌面和一个 Web 应用程序,它们共享一些数据库记录。我当前正在尝试将信息保存到我们的用户记录中(两个应用程序当前共享),并且当它在桌面应用程序中打开时,用户记录被锁定。

现在,如果在尝试编辑/更新信息时用户记录被锁定,Web 应用程序只会引发错误。

我的任务是在用户记录解锁后立即使用某些信息更新用户记录(我们更关心它一次仅锁定几分钟,而不是几个小时)

我必须保存到用户对象的一件事是 javascript 构建的可排序菜单的菜单位置...所以我想要一个在后台工作并尝试保存菜单项位置的 jQuery ajax 调用直至用户记录解锁。

我设置了一个通用处理程序(.ashx),它调用用户对象中的更新方法,以保存菜单位置和其他数据。我知道如何进行 ajax 调用以及所有这些,但我只是无法理解如何拥有一个不断尝试保存直到记录解锁的后台进程。

也许工作函数类似于:

(function worker() {
        $.ajax({
            url: 'ajax/test.html',
            success: function (data) {
                $('.result').html(data);
            },
            complete: function () {
                // Schedule the next request when the current one's complete
                setTimeout(worker, 5000);
            }
        });
    })();

...哪个有超时或 setInterval?诚然,我没有为此编写任何代码(除了后端检查锁定记录并尝试保存到用户对象的方法之外)。

有人可以帮忙吗?

编辑

  try
  {        
    UniFile userSecurityFile = CurrentSession.CreateUniFile("USER.SECURITY");
    userSecurityFile.WriteField(this.UserId, 443);        
  }
  catch (UniFileException ex)
  {
    Exception betterExceptionToThrow = null;
    if (ex.IsRecordLockedError())
    {
      betterExceptionToThrow = new RecordAccessException(RecordAccessIssueType.Locked, "Could not save because record is locked");
    }
  }

最佳答案

您甚至不应该尝试使用 Javascript 来解决此问题 - JS 可以很好地从服务器获取数据或将数据发布到服务器,但您无法知道同一用户是否同时使用另一个浏览器或另一台机器 - 这些可能同时向服务器生成相同的写入请求。

您需要有线程安全的服务器端入口点来对数据执行 CRUD 操作。您可以使用 JS/Ajax 调用这些入口点,但这些函数必须捕获来自底层数据库层的异常,并向浏览器返回某种错误代码(或其他错误状态)以告知 UI写入尝试失败的层。无法保证保存不会出错,客户端可能必须重试多次才能成功。

当服务器端代码尝试完成写入操作时,您必须确保处理应用程序数据层中的并发问题。欲了解更多信息,请阅读Concurrency control - 然而,这是一个巨大的主题,简单的文章不会让您走得太远。您必须决定是否可以允许多次写入尝试(最后一次获胜),或者是否对已更改记录的所有写入尝试都应该失败。

编辑:

如果我误解了你的问题,并且你的服务器端代码已经处理了上述所有内容,那么在浏览器中你需要做的就是设置一个 Ajax 调用,等待返回值,如果失败,请重试 < em>N 次。在这种情况下,您的示例代码大致就是您所需要的。

关于javascript - 使用 jQuery 和 ajax 尝试写入锁定记录的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26874942/

相关文章:

javascript - 图像不通过 jquery 显示

javascript - knockout template - 将文本绑定(bind)到函数,并传入模板数据

.net - 继承 SortedDictionary - 这是好的编程习惯吗?

jquery - Kendo AutoComplete - 在自动完成文本的开头设置光标

c# - 使用 Linq 搜索两个项目的组合

c# - 跨进程使用事务

javascript - 如何在 JavaScript 中使用 indexOf 和 filter()

JavaScript - 如何更改字符串的元素?

javascript - 使用 html-webpack-plugin 将对象传递给 ejs 加载器

javascript - 如何获取具有特定 Id 的 div 中的下一个元素