数据库记录锁定

2024-02-02

我有一个服务器应用程序和一个数据库。服务器的多个实例可以同时运行,但所有数据都来自同一个数据库(在某些服务器上是 postgresql,在其他情况下是 ms sql server)。

在我的应用程序中,执行一个过程可能需要几个小时。我需要确保该进程一次只执行一个。如果一台服务器正在处理,则在第一个服务器实例完成之前,其他服务器实例都无法处理。

该流程依赖于一张表(我们称之为“ProcessTable”)。我所做的是,在任何服务器启动长达一小时的进程之前,我在 ProcessTable 中设置一个布尔标志,指示该记录已“锁定”并且正在处理(并非该表中的所有记录都被处理/锁定,所以我需要专门标记流程需要的每条记录)。因此,当下一个服务器实例出现而前一个实例仍在处理时,它会看到布尔标志并引发异常。

问题是,两个服务器实例可能几乎同时被激活,并且当两个服务器实例都检查 ProcessTable 时,可能没有设置任何标志,但两个服务器实际上都在“设置”标志的过程中,但由于事务尚未为任一进程提交,两个进程都不会看到另一个进程完成的锁定。这是因为锁定机制本身可能需要几秒钟的时间,因此存在 2 个服务器可能仍能够同时处理的机会窗口。

看来我需要的是“设置”表中的一条记录,它应该存储一个名为“LockInProgress”的布尔标志。因此,在服务器可以锁定 ProcessTable 中所需的记录之前,它首先必须通过检查“Settings”表中的“LockInProgress”列来确保它具有执行锁定的完全权限。

所以我的问题是,如何防止两台服务器同时修改设置表中的 LockInProgress 列...或者我是否以错误的方式处理此问题?

请注意,我需要同时支持 postgresql 和 ms sql 服务器,因为有些服务器使用一个数据库,有些服务器使用另一个数据库。

提前致谢...


首先获取记录上的锁,然后更新记录以显示“已锁定”如何?这样可以避免第二个实例成功获得锁而导致记录更新失败。

重点是确保锁定和更新作为一个原子步骤。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据库记录锁定 的相关文章

  • 将 .MDF SQL Server 数据库与 ASP.NET 结合使用与使用 SQL Server

    我目前正在 ASP NET MVC 中编写一个网站 我的数据库 其中还没有任何数据 只有正确的表 使用 SQL Server 2008 我已将其安装在我的开发计算机上 我使用服务器资源管理器从应用程序连接到数据库 然后使用 LINQ to
  • 从 PostgreSQL 中同一列中以其他值开头的列中检索所有值的有效方法

    为了简单起见 假设您有一个包含如下数字的表 number 123 1234 12345 123456 111 1111 2 700 检索最短数字的有效方法是什么 称它们为roots或其他 和所有值derived来自他们 例如 root de
  • 使用 CLR 返回表

    我想编写一个 CLR 过程 它接受一个文本并返回一个包含该文本中所有单词的表 但我不知道如何返回一张桌子 你能告诉我吗 Microsoft SqlServer Server SqlFunction public static WhatTyp
  • 数据库未在客户端系统上运行的 C# Windows 窗体应用程序

    我用 C 开发了一个使用 SQL Server 数据库连接的 Windows 窗体应用程序 我在 NET Framework 4 0 和 SQL Server 2008 R2 中开发它 我的应用程序正在使用应用程序根目录中存在的本地数据库
  • Postgresql 一张表的多个计数

    我想从表中的两列中获得这些列中值的统一计数 例如 两列是 表 报告 type place one home two school three work four cafe five friends six mall one work one
  • 加密数据库字段的好方法?

    我被要求加密数据库中的各种数据库字段 问题是这些字段在读取后需要解密 我在用着Django and SQL Server 2005 有什么好主意吗 See 在 SQL Server 2005 数据库中使用对称加密 https web arc
  • 根据日期顺序排名

    我的数据如下 Heading Date A 2009 02 01 B 2009 02 03 c 2009 02 05 d 2009 02 06 e 2009 02 08 我需要如下排名 Heading Date Rank A 2009 02
  • 将 UNNEST 与 jOOQ 结合使用

    我正在使用 PostgreSQL 9 4 Spring Boot 1 3 2 和 jOOQ 3 7 我想 jOOQify 以下查询 SELECT id FROM users WHERE username IN SELECT FROM UNN
  • 如何将 数组传递给存储过程

    我有一个清单索赔数据在 C 中 它有三个项目 日期 类型和描述 其中可以有多行 如下所示 索赔数据 Date Type Description 01 02 2012 Medical Its a medical 05 02 2013 Thef
  • Reporting Services 在哪里存储其日志文件

    最相关的谷歌结果似乎表明 为了访问日志 我们必须将您自己的日志表部署到数据库并制作报告服务写入它 http technet microsoft com en us library ms157403 aspx 简而言之 Reporting S
  • 数据库字段中的逗号分隔值

    我有一个产品表 该表中的每一行对应一个产品 并由唯一的 ID 标识 现在 每个产品都可以有多个与该产品关联的 代码 例如 Id Code 0001 IN ON ME OH 0002 ON VI AC ZO 0003 QA PS OO ME
  • SQLite中的ROWID是自动设置的吗?

    所以 我在 Ionic 上有这个应用程序 它使用SQLite ngCordova 插件 https github com litehelpers Cordova sqlite storage用于内部存储 在其上 我使用以下命令创建一个表 d
  • 删除行导致锁超时

    当我尝试从表中删除行时 我不断收到这些错误 这里的特殊情况是我可能同时运行5个进程 该表本身是一个 Innodb 表 约有 450 万行 我的 WHERE 子句中使用的列没有索引 其他指数按预期运行 这是在事务中完成的 首先删除记录 然后插
  • 这种文件锁定方法可以接受吗?

    我们有 10 个 Linux 机器 每周必须运行 100 个不同的任务 这些计算机主要在我们晚上在家时执行这些任务 我的一位同事正在开发一个项目 通过使用 Python 自动启动任务来优化运行时间 他的程序将读取任务列表 抓取一个打开的任务
  • 从 Getdate() 获取时间

    我想采取Getdate 结果 例如 2011 10 05 11 26 55 000 into 11 26 55 AM 我看过其他地方并发现 Select RIGHT CONVERT VARCHAR GETDATE 100 7 这给了我 11
  • 无法在 Sqlite3 中添加默认值为 NULL 的 NOT NULL 列

    尝试将 NOT NULL 列添加到现有表时出现以下错误 为什么会发生这种情况 我尝试了 rake db reset 认为现有记录是问题所在 但即使重置数据库后 问题仍然存在 你能帮我解决这个问题吗 迁移文件 class AddDivisio
  • 转义 to_tsquery 中的特殊字符

    如何转义传递给的字符串中的特殊字符to tsquery 例如 这种查询 select to tsquery AT T 生产 NOTICE text search query contains only stop words or doesn
  • 使用加权行概率从 PostgreSQL 表中选择随机行

    输入示例 SELECT FROM test id percent 1 50 2 35 3 15 3 rows 你会如何编写这样的查询 平均 50 的时间我可以获得 id 1 的行 35 的时间 id 2 的行 15 的时间 id 3 的行
  • 我是否需要在外键上指定 ON DELETE NO ACTION?

    我有以下与 SQL Server 2012 一起使用的 DDL CREATE TABLE Subject SubjectId INT IDENTITY 1 1 NOT NULL Name NVARCHAR 50 Not NULL CONST
  • 如何获取自定义订单的结果? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 代替ASC or DESC 我希望我的查询结果采用特定的自定义顺序 例如 如果我想要的结果不是 A B C D 而是 P A L H 该怎么

随机推荐