我在SQL服务器中有一个表,它由在不同会话中同时运行的存储过程同时进行CRUD:
|----------------|---------|
| <some columns> | JobGUID |
|----------------|---------|
该程序的工作原理如下:
存储过程中的每个select/insert/update/delete语句都有一个WHERE JobGUID = @jobGUID子句,因此该过程仅适用于它在步骤2中插入的记录.但是,有时当同一存储过程在不同的连接中并行运行时,会发生死锁共享表.以下是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锁).
我在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) 当我在下面的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#程序中有一个DataGridView对象,根据打开的过滤器设置,有时会有隐藏的行.我MultiSelect将DGV中的设置设置为True,当单击另一个按钮时,每行的ID将移动到ListBox.但是,我注意到,如果我按下CTRL-A,所有行(包括隐藏的行)也会被移动.我通过将其Visible属性更改为False来隐藏行.
我环顾四周但找不到让CTRL-A命令只选择可见行的解决方案.这可能吗?
谢谢!
c# ×2
winforms ×2
concurrency ×1
datagridview ×1
deadlock ×1
devexpress ×1
gridview ×1
highlighting ×1
powershell ×1
primary-key ×1
security ×1
sql-server ×1