小编Yur*_*uts的帖子

可以添加主键标识列来解决死锁问题吗?

我在SQL服务器中有一个表,它由在不同会话中同时运行的存储过程同时进行CRUD:

|----------------|---------|
| <some columns> | JobGUID |
|----------------|---------|

该程序的工作原理如下:

  1. 生成GUID.
  2. 将一些记录插入上述共享表中,并使用步骤1中的GUID标记它们.
  3. 对步骤2中的所有记录执行一些更新.
  4. 从步骤3中选择记录作为SP输出.

存储过程中的每个select/insert/update/delete语句都有一个WHERE JobGUID = @jobGUID子句,因此该过程仅适用于它在步骤2中插入的记录.但是,有时当同一存储过程在不同的连接中并行运行时,会发生死锁共享表.以下是SQL Server Profiler的死锁图:

SQL Server Profiler死锁图

锁定升级不会发生.我尝试向(UPDLOCK, ROWLOCK)所有DML语句添加锁定提示和/或在事务中包装过程的主体并使用不同的隔离级别,但它没有帮助.共享表上的RID锁定仍然相同.

之后我发现共享表没有主键/标识列.一旦我添加它,死锁似乎已经消失:

alter table <SharedTable> add ID int not null identity(1, 1) primary key clustered
Run Code Online (Sandbox Code Playgroud)

当我删除主键列时,死锁又回来了.当我把它添加回来时,我再也无法重现死锁了.

那么,问题是,主键身份列真的能够解决死锁还是巧合?

更新:作为@Catcall建议,我已经尝试创建现有列的自然聚集主键(无添加标识列),但还是抓住了相同的僵局(当然,这一次是一键锁定,而不是RID锁).

sql-server concurrency deadlock primary-key

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

哈希表漏洞(属性覆盖)?

我在PowerShell中使用哈希表,我注意到一些与访问项目有关的奇怪行为.我们知道,PowerShell至少允许三种不同的方式为散列表条目赋值:

$hashtable["foo"] = "bar"        #1
$hashtable.Item("foo") = "bar"   #2
$hashtable.foo = "bar"           #3
Run Code Online (Sandbox Code Playgroud)

同时,我们使用#3语法访问Hashtable对象本身,如性能Count,Keys,Values等如果我们有与内部属性的名称冲突的关键添加项目,PowerShell的让我们这样做,我们实际上不再能够读取属性的值(除了使用Reflection).

我想在密钥来自不可信赖的来源(例如来自外部文件或网络)的情况下,这可能会对流量控制产生不良影响,并且可能被恶意用户利用.

此代码段演示了此问题:

function Get-HashtableProperties($hashTable, $header)
{
    "{0} {1} {0}" -f ("-" * 10), $header

    "Count                      : {0}" -f $hashtable.Count
    "Keys.Count                 : {0}" -f $hashtable.Keys.Count
    "Values.Count               : {0}" -f $hashtable.Values.Count
    "Actual Count (Reflection)  : {0}" -f $hashtable.GetType().GetProperty("Count").GetValue($hashtable)

    "`nItems (Keys iteration):"
    $hashtable.Keys | ForEach-Object { "  [ {0} = {1} ]" -f $_, $hashtable.Item($_) }

    "`nItems (Enumerator iteration):"
    $enumerator = $hashTable.GetEnumerator()
    while …
Run Code Online (Sandbox Code Playgroud)

security powershell

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

除了单击的单元格外,XtraGrid整行都会突出显示

当我在下面的GridView中选择一行时,我的鼠标所在的单元格(换句话说,我左键单击的单元格)选择一行不会突出显示,而行的其余部分都会突出显示.

我很感激你的帮助.

GridView myView = (GridView)oGrid.MainView;
myView.OptionsSelection.MultiSelect = true;
myView.OptionsSelection.MultiSelectMode = GridMultiSelectMode.RowSelect;

if (myView.RowCount > 0)
{
    frmChangeMyStatus ff = new frmChangeMyStatus(ccfrms);
    DialogResult dr = ff.ShowDialog();

    if (dr == DialogResult.OK)
    {
        for (int i = 0; i < myView.SelectedRowsCount; i++)
        {
            row = myView.GetSelectedRows()[i];
               //...........
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

c# gridview devexpress highlighting winforms

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

CTRL-A选择DataGridView中的隐藏行

我在我的C#程序中有一个DataGridView对象,根据打开的过滤器设置,有时会有隐藏的行.我MultiSelect将DGV中的设置设置为True,当单击另一个按钮时,每行的ID将移动到ListBox.但是,我注意到,如果我按下CTRL-A,所有行(包括隐藏的行)也会被移动.我通过将其Visible属性更改为False来隐藏行.

我环顾四周但找不到让CTRL-A命令只选择可见行的解决方案.这可能吗?

谢谢!

c# datagridview winforms

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