如何在SQL Server上强制执行SELECT阻止?

iluomo

我看到了很多有关避免阻塞的信息。我的情况是我想阻止。

我们有此表,两个单独的进程将使用该表相互通信。这些进程将在随机时间运行,并将使用此控制表来了解其他进程是否繁忙。两个进程不能同时忙,因此控制表。

每个作业在运行时都将检查控制表...,并根据该数据来决定是否可以运行,如果可以,则将更新控制表记录。

问题是,如果两个进程同时运行,则不清楚它们是否将不执行以下不希望的操作(按此确切顺序):

  1. 进程A读取控制表(表说该行了)
  2. 程序B读取控制表(表说很对)
  3. 进程A更新控制表(表现在显示“进程A忙”)
  4. 过程B更新控制表(表现在显示“过程B忙”)

<-在这种情况下,两个进程都认为他们已成功更新了控制表,并将开始其主流程(这不是我们想要的)

我在这里想要的是要从控制表中选择(而不是仅更新)阻止ProcB。这样,如果/当Proc B的选择查询最终起作用时,它将看到更新的“忙”值,而不是Proc A更改之前已存在的值。

我相信我们正在使用SQL Server 2008 R2。我检查了SERIALIZABLE隔离,但是它似乎不够坚固。

为了值得的是,我们尝试使用JDBC完成此操作... conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);

我们知道这是最高的隔离级别,但是我仍然可以从另一个窗口全天运行select。

我100%确信这绝不是一个独特的问题。...有人对此工作有任何建议吗?

Heinzi

您的方法可行,但是需要考虑以下几点:

  1. 您需要在开始时(在第一次读取之前)打开一个事务,并且必须完成工作后才提交它

  2. 如果A和B都尝试读取/修改相同的记录,即使使用默认的事务隔离级别(READ COMMITTED),该操作也将立即可用。否则,您需要告诉SQL Server锁定整个表(使用TABLOCK提示)。

  3. 实际上,您根本不需要读取!

它是这样工作的:

     P1                 P2
 ---------------------------------
  BEGIN TRANS
                     BEGIN TRANS
  WRITE (success)
                     WRITE (blocked)
  do work            |
  .                  |
  .                  | 
  COMMIT     ->      block released, WRITE finishes

                     do work
                     . 
                     .
                     COMMIT

PS:但是请注意,SQL Server支持应用程序锁因此,如果您只想同步两个进程,则无需“滥用”表:

PPS:为完整起见,让我也回答标题中的问题(“如何在SQL Server上强制执行SELECT阻止?”):为此,可以结合使用HOLDLOCKXLOCK 表提示(或者TABLOCKX,如果要独占使用,锁定整个表格)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在python列表上强制执行特定类型

来自分类Dev

如何在Windows 7上强制执行解析

来自分类Dev

SQL Server:如何在事务结束时强制执行完整性?

来自分类Dev

强制执行SQL Server查询以不返回任何行

来自分类Dev

如何在UI线程上执行冗长的任务期间强制执行UI更新

来自分类Dev

如何在正在运行的脚本上强制执行Python垃圾回收

来自分类Dev

如何在ASP.Net WebForms的DataField上强制执行toUpper?

来自分类Dev

如何在Oracle表上强制执行唯一的2元组?

来自分类Dev

当 UseShellExecute == false 时,如何在 C# 进程上强制执行标准输出?

来自分类Dev

如何在SQL(Postgres)中强制执行过滤器评估顺序?

来自分类Dev

如何在Spark SQL中强制执行内存中的分块排序?

来自分类Dev

如何在Spark SQL中强制执行内存中的分块排序?

来自分类Dev

如何在.Net中强制执行OutOfMemoryException

来自分类Dev

如何在Perl中强制执行long double

来自分类Dev

如何在Chrome中强制执行504错误

来自分类Dev

如何在vb.net中调试强制执行?

来自分类Dev

如何在Perl中强制执行long double

来自分类Dev

如何在Java中强制执行构造函数

来自分类Dev

如何在GNOME Web中强制执行大文本?

来自分类Dev

如何在Jenkins DSL中强制执行参数排序?

来自分类Dev

如何在matplotlib中的网格内强制执行图?

来自分类Dev

如何在 Antlr 中强制执行某些规则

来自分类Dev

如何在 Java <= 8 中强制执行模块边界

来自分类Dev

如何在两点之间强制执行约束

来自分类Dev

如何强制执行结果顺序

来自分类Dev

SQL:如何使用约束强制执行功能依赖关系?

来自分类Dev

在SQL Server表中强制执行每周一次的输入

来自分类Dev

如何解决“资源要求请求启用CORS ...资源已被阻止,因为无法强制执行完整性”错误

来自分类Dev

Microsoft SQL Server - 如何仅在插入时强制执行外键但允许保留孤立外键?

Related 相关文章

  1. 1

    如何在python列表上强制执行特定类型

  2. 2

    如何在Windows 7上强制执行解析

  3. 3

    SQL Server:如何在事务结束时强制执行完整性?

  4. 4

    强制执行SQL Server查询以不返回任何行

  5. 5

    如何在UI线程上执行冗长的任务期间强制执行UI更新

  6. 6

    如何在正在运行的脚本上强制执行Python垃圾回收

  7. 7

    如何在ASP.Net WebForms的DataField上强制执行toUpper?

  8. 8

    如何在Oracle表上强制执行唯一的2元组?

  9. 9

    当 UseShellExecute == false 时,如何在 C# 进程上强制执行标准输出?

  10. 10

    如何在SQL(Postgres)中强制执行过滤器评估顺序?

  11. 11

    如何在Spark SQL中强制执行内存中的分块排序?

  12. 12

    如何在Spark SQL中强制执行内存中的分块排序?

  13. 13

    如何在.Net中强制执行OutOfMemoryException

  14. 14

    如何在Perl中强制执行long double

  15. 15

    如何在Chrome中强制执行504错误

  16. 16

    如何在vb.net中调试强制执行?

  17. 17

    如何在Perl中强制执行long double

  18. 18

    如何在Java中强制执行构造函数

  19. 19

    如何在GNOME Web中强制执行大文本?

  20. 20

    如何在Jenkins DSL中强制执行参数排序?

  21. 21

    如何在matplotlib中的网格内强制执行图?

  22. 22

    如何在 Antlr 中强制执行某些规则

  23. 23

    如何在 Java <= 8 中强制执行模块边界

  24. 24

    如何在两点之间强制执行约束

  25. 25

    如何强制执行结果顺序

  26. 26

    SQL:如何使用约束强制执行功能依赖关系?

  27. 27

    在SQL Server表中强制执行每周一次的输入

  28. 28

    如何解决“资源要求请求启用CORS ...资源已被阻止,因为无法强制执行完整性”错误

  29. 29

    Microsoft SQL Server - 如何仅在插入时强制执行外键但允许保留孤立外键?

热门标签

归档