当前位置: 首页 > 面试题库 >

选择行并更新相同的行以进行锁定?

姜森
2023-03-14
问题内容

我需要编写一个过程,该过程将允许我选择x数量的行,并同时更新这些行,以便调用应用程序将知道这些记录已锁定并正在使用。我在表中有一个名为“锁定”的列。下次调用该过程时,它将仅提取下一个x数量未选中“锁定”列的记录。我已经阅读了一些有关SQL
Server的OUTPUT方法的信息,但是不确定这是我想要做的。


问题答案:

使用OUTPUT投票表决Cade Roux的答案:

UPDATE #tbl
   SET locked = 1
OUTPUT INSERTED.*
 WHERE id IN (SELECT TOP 1 id
                FROM #tbl
               WHERE locked = 0
            ORDER BY id)鈥�

之前:

这是我可以想到的使用临时表的少数情况之一:

ALTER PROCEDURE temp_table_test
AS
BEGIN

   SELECT TOP 5000 * 
     INTO #temp_test
     FROM your_table
    WHERE locked != 1
 ORDER BY ?

   UPDATE your_table
      SET locked = 1
    WHERE id IN (SELECT id FROM #temp_test)

   SELECT *
     FROM #temp_test

   IF EXISTS (SELECT NULL
                FROM tempdb.dbo.sysobjects
               WHERE ID = OBJECT_ID(N'tempdb..#temp_test'))
   BEGIN
     DROP TABLE #temp_test
   END

END

这:

  1. 获取所需的行,将其填充到本地临时表中
  2. 使用临时表更新要“锁定”的行
  3. 临时表中的SELECT可以为您提供结果集输出
  4. 删除临时表,因为它们用于该会话


 类似资料:
  • 问题内容: 我有一个可以支持一定数量的并发操作的应用程序。这由postgres中的“插槽”表表示。当节点联机时,它们会在表中插入许多行,每个插槽一个。当作业声明插槽时,它们会更新表中声明其中一个插槽的行,并在完成时再次释放它。 插槽表如下所示: 在任何时候,它都有一些固定的行数,每行可以或可以不填写job_name。 当新作业要启动时,它将运行以下查询以获取应在其上运行的节点的名称: (从游标中读

  • 问题内容: 根据MySql文档,MySql支持多重粒度锁定(MGL)。 打开终端1: //连接到mysql 离开它打开并打开终端2: //连接到mysql 尽管要检索的行很多,但T2等待直到t1完成。 情况2 保持端子1不变,现在位于端子2中: 但是,为什么在情况1中,T2等待T1锁定的同一行集? 这是否意味着无限制的选择查询(即使使用limint参数。我也尝试了不同的范围)阻塞了整个表? 有什么

  • 问题内容: 我正在尝试使用相同的表查询更新行。语境: 我想:对于每一行;如果 TEXT为NULL ; 使用具有相同ID且LANG =’EN’的行的TEXT值更新它。 做这样的事情的SQL请求是什么? 问题答案: 您没有指定数据库。以下是标准SQL: 如果出现重复,则应执行以下操作: 编辑: 当然,并非所有数据库都支持所有ANSI标准功能。在MySQL中,您可以改用:

  • 问题内容: 有没有简单的方法来选择更新的行? 我试图每次读取行时都存储时间戳,以便能够删除长时间未读取的数据。 首先,我首先尝试执行查询,甚至发现有点慢但是简单的解决方案,例如 但我仍然想找到一种正常的方法来做到这一点。 我还认为先更新时间然后选择更新的行应该容易得多,但是即使如此,我也没有找到任何东西 问题答案: 声明该列,如下所示: 然后,每当更新一行时,该列就会自动更新。 更新: 我认为没有

  • 问题内容: 我有一张桌子,像这样: 我想选择具有相同基因座和染色体的所有行。例如,第3行和第4行。一次可能有2个以上,并且它们可能不是按顺序排列的。 我尝试了这个: 但是,即使重复,它总是返回第3行,从不返回第4行。我想我缺少明显而简单的东西,但我茫然。 有人可以帮忙吗? 问题答案: 您需要了解,当您在查询中包含内容时,您是在告诉SQL合并行。您将为每个唯一值获得一行。在随后过滤这些组。通常,您可

  • 问题内容: 如何更新子查询中也存在的表?我必须分两个阶段进行吗?(创建一个临时表-将选定的数据放入其中,然后更新最终表) 我正在尝试使用每个CTN的网络标签更新invoiceLine表。 最终结果将是: invoiceLine 我有以下表格: invoiceLine ctn network 1234 null 2345 null 3456 null terminal ctn network 123