小编asa*_*rob的帖子

在 SQL Server 和 DB 锁中使用外键

我使用 SQL Server 已经很长时间了,当表之间存在逻辑连接时,我总是使用 FK 和索引

例子:

MyTable1
{
    ID      BIGINT IDENTITY (1, 1)  NOT NULL,
    SomeData    NVARCHAR(255)       NOT NULL,
    MyFK        BIGINT          NULL -- this is a FK to MyTable2.ID
}

MyTable2
{
    ID      BIGINT IDENTITY (1, 1)  NOT NULL,
    SomeData    NVARCHAR(255)       NOT NULL
}
Run Code Online (Sandbox Code Playgroud)

现在问题来了,当我在 MyTable1 上执行一些更新 MyFK 的批量更新操作,同时对 MyTable2 执行插入语句时,我们会挂起直到发生超时或更新完成并释放锁。

据我所知,在插入具有 FK 的表时,数据库引擎需要锁定相关表以验证 FK,这就是问题的根源。

我试图解决问题的事情:

这两种解决方案都导致我陷入僵局和糟糕的性能。

当我删除 FK 时,一切正常,但存在数据损坏的风险。

问题:

  1. 关于在哪里使用 FK 和在哪里不使用有任何推荐的规则吗?
  2. 除了移除 FK 以克服我的问题之外,您能否为我提供任何其他解决方案?

sql-server foreign-keys sql-server-2008-r2 database-deadlocks

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

命令设计模式——允许不同的具体命令返回不同的类型

我们正在设计一个新组件并考虑使用命令设计模式。

我们有两种主要类型的命令来实现我们的IOurCommand接口(其他命令将从中继承)。

问题是第一个命令CommandDoUpdates不需要返回任何值,而第二个命令CommandGetData是获取数据,所以它需要返回List一些对象(List<DataRow>

我们正在考虑处理这种情况的事情:

  1. 返回一个 Class ,其中将包含有关操作成功的指示(奖励)和一个对象列表,该对象列表将是所有CommandDoUpdates.
  2. 保持List作为具体命令的成员 - 潜在的解决方案,但由于其他原因(浅拷贝与深拷贝等)使我们的生活变得更加艰难。
  3. 与 #1 相同,但在函数中返回一个基类,并且每个调用 calss 都必须将结果向下转换为具体类(向下转换不是一个好做法,因为客户端需要知道实际返回值是什么)。
  4. 将命令分成两个不同的层次结构(一个返回值,一个不返回值),并使用两个不同的接收器 - 我真的不喜欢它,但这是一种选择。

这篇文章是关于命令是否应该返回值/状态的好读物。这是相关的,因为在 GoF 书中,命令设计模式不返回值。

我的实际问题是:

  • 你能想到更好的解决方案吗?
  • 选项 1,2 和 3 的任何优点或缺点,选项 4 的任何优点?

谢谢!

c# design-patterns return-value

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

访问C++一维数组,如arr [1,2,3] - 这是什么意思?

考虑这段代码(它在VisualStudio 2012上编译并运行)

#include "stdafx.h"
#include <iostream>

int _tmain(int argc, _TCHAR* argv[])
{
    int arr[100];
    for (int i = 0; i < 100; ++i)
        arr[i]=i;

    int a = arr[10]; // 10
    int a1 = arr[10,10]; // 10 <-
    int a3 = arr[5,10,7]; // 7 <-
    int a4 = arr[5,10,7,2]; // 2 <-
}
Run Code Online (Sandbox Code Playgroud)

我不明白标有< - 我期望编译错误的行的含义是什么.实际结果就像仅指定[]中的最后一个数字一样

那么,这意味着什么?到底有什么好处呢?

c++ arrays syntax

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