- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下死锁图,它描述了两个相互死锁的 sql 语句。我只是不确定如何分析这个问题,然后修复我的 sql 代码以防止这种情况发生。
主死锁图
alt text http://img140.imageshack.us/img140/6193/deadlock1.png
Click here for a bigger image.
左侧,细节
alt text http://img715.imageshack.us/img715/3999/deadlock2.png
Click here for a bigger image.
右侧,细节
alt text http://img686.imageshack.us/img686/5097/deadlock3.png
Click here for a bigger image.
原始死锁架构 xml 文件
Click here to download the xml file .
表模式
alt text http://img509.imageshack.us/img509/5843/deadlockschema.png
日志条目表详细信息
alt text http://img28.imageshack.us/img28/9732/deadlocklogentriestable.png
连接的客户端表详细信息
alt text http://img11.imageshack.us/img11/7681/deadlockconnectedclient.png
代码在做什么?
我正在同时读取多个文件(例如,在此示例中可以说是 3 个)。每个文件包含不同的数据,但数据类型相同。然后我将数据插入 LogEntries
表,然后(如果需要)我从 ConnectedClients
中插入或删除某些内容 table 。
这是我的 sql 代码。
using (TransactionScope transactionScope = new TransactionScope())
{
_logEntryRepository.InsertOrUpdate(logEntry);
// Now, if this log entry was a NewConnection or an LostConnection, then we need to make sure we update the ConnectedClients.
if (logEntry.EventType == EventType.NewConnection)
{
_connectedClientRepository.Insert(new ConnectedClient { LogEntryId = logEntry.LogEntryId });
}
// A (PB) BanKick does _NOT_ register a lost connection .. so we need to make sure we handle those scenario's as a LostConnection.
if (logEntry.EventType == EventType.LostConnection ||
logEntry.EventType == EventType.BanKick)
{
_connectedClientRepository.Delete(logEntry.ClientName, logEntry.ClientIpAndPort);
}
_unitOfWork.Commit();
transactionScope.Complete();
}
UnitOfWork
实例(这意味着它有自己的数据库连接、事务和存储库上下文)。所以我假设这意味着有 3 个不同的数据库连接同时发生。
Entity Framework
作为存储库,但请不要让它阻止您考虑这个问题。
Isolation Level
是
Serializable
.我也试过
ReadCommited
和
ReadUncommited
,但他们都错误:-
ReadCommited
: 和上面一样。僵局。 ReadUncommited
: 不同的错误。 EF 异常表示它希望得到一些结果,但什么也没得到。我猜这是 LogEntryId
预期的身份 ( scope_identity
) 值,但由于脏读而无法检索。 The last piece of the puzzle, the unexplained lock left node has on the PK_ConnectedClients, I will assume is from the EF implementation of InsertOrUpdate. It probably does a lookup first, and because of the FK relationship declared between ConnectedClients and LogEntries, it seeks on PK_ConnectedClients, hence acquiring the serializable lock.
PK_ConnectedClients
,如上所述。好的,让我们看看该方法的代码......
public void InsertOrUpdate(LogEntry logEntry)
{
LoggingService.Debug("About to InsertOrUpdate a logEntry");
logEntry.ThrowIfArgumentIsNull("logEntry");
if (logEntry.LogEntryId <= 0)
{
LoggingService.Debug("Current logEntry instance doesn't have an Id. Instance object will be 'AddObject'.");
Context.LogEntries.AddObject(logEntry);
}
else
{
LoggingService.Debug("Current logEntry instance has an Id. Instance object will be 'Attached'.");
Context.LogEntries.Attach(logEntry);
}
}
AddObject
(又名。插入)或
Attach
(又名。更新)。没有引用。 Sql 代码也没有暗示任何查找内容。
public void Insert(ConnectedClient connectedClient)
{
connectedClient.ThrowIfArgumentIsNull("connectedClient");
Context.ConnectedClients.AddObject(connectedClient);
}
public void Delete(string clientName, string clientIpAndPort)
{
clientName.ThrowIfArgumentIsNullOrEmpty("clientName");
clientIpAndPort.ThrowIfArgumentIsNullOrEmpty("clientIpAndPort");
// First we need to attach this object to the object manager.
var existingConnectedClient = (from x in GetConnectedClients()
where x.LogEntry.ClientName == clientName.Trim() &&
x.LogEntry.ClientIpAndPort == clientIpAndPort.Trim() &&
x.LogEntry.EventTypeId == (byte)EventType.NewConnection
select x)
.Take(1)
.SingleOrDefault();
if (existingConnectedClient != null)
{
Context.ConnectedClients.DeleteObject(existingConnectedClient);
}
}
Serializable
或
Read Commited
- 当我不调用
Delete
时,两者都可以工作方法。
serializable
)锁定并发生了一些死锁?
read committed
,是否有可能同时发生 3 个删除调用。
最佳答案
左侧节点持有一个 RangeS-U lock
在 PK_CustomerRecords
并想要一个 RangeS-U
锁定 i1
(我假设它是 LogEntries
上的索引)。右侧节点有一个 RangeS-U
锁定 i1
并想要一个 RangeI-N
在 PK_CustomerRecords
.
显然死锁发生在 _logEntriesRepository.InsertOrUpdate
之间(左节点)和 _connectedClientRepository.Insert
(右节点)。在不知道声明的 EF 关系类型的情况下,我无法评论为什么左侧节点锁定了 PK_CustomerRecords
目前它插入 LogEntry
.我怀疑这是由 EF 引发的 ORM 类型行为引起的,例如查找“预加载”成员,或者可能是由更高级别的 TransactionScope 引起的,该事务范围围绕发布的代码片段中的范围。
正如其他人所说,有必要在死锁评估中发布数据库模式,因为访问路径(使用的索引)至关重要。看我的文章Read-Write deadlock有关死锁中索引含义的更详细讨论。
我的第一个建议是强制交易范围为 read committed
.在实践中几乎从不需要默认的 TransactionScopes 可序列化级别,这是一个性能 pig ,在这种特殊情况下,通过将范围锁引入等式,为死锁调查添加了许多不必要的噪音,使一切变得复杂。请把读提交下发生的死锁信息贴出来。
另外,不要张贴死锁图的图片。一张图千言万语不在这里,贴出原来的死锁XML:它有很多在漂亮的图片中看不到的信息。
更新
从死锁 XML 我可以看到左节点正在执行 insert [dbo].[LogEntries]([GameFileId], [CreatedOn], [EventTypeId], [Message], [Code], [Violation], [ClientName], [ClientGuid], [ClientIpAndPort]) values (@0, @1, @2, null, null, null, @3, @4, @5)
(<executionStack><frame>
元素)。但更重要的是,我可以看到神秘索引“i1”后面的对象:objectname="AWing.sys.fulltext_index_docidstatus_1755869322"
indexname="i1"
.所以死锁发生在 上全文索引 .
所以死锁的完整解释是:
关于.net - 为什么这两条sql语句会死锁? (死锁图+详细信息包括在内),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2483294/
创建一个“海盗对话”,可以选择左手或右手。我希望它对“左”和“右”的不同拼写做出积极的回答(正如您将在代码中看到的那样),但是,当我为所有非“右”或“左”的输入添加最终的“else”代码时,它给了我一
With 语句 对一个对象执行一系列的语句。 With object statements End With 参数 object 必需的部分
While...Wend 语句 当指定的条件为 True 时,执行一系列的语句。 While condition  ; Version [stat
所以我正在处理的代码有一个小问题。 while True: r = input("Line: ") n = r.split() if r == " ":
我有一个对象数组: var contacts = [ { "firstName": "Akira", "lastName": "Laine", "number"
int main() { int f=fun(); ... } int fun() { return 1; return 2; } 在上面的程序中,当从main函数中调用一个
我的项目中有很多 if 语句、嵌套 if 语句和 if-else 语句,我正在考虑将它们更改为 switch 语句。其中一些将具有嵌套的 switch 语句。我知道就编译而言,switch 语句通常更
Rem 语句 包含程序中的解释性注释。 Rem comment 或 ' comment comment 参数是需要包含的注释文本。在 Rem 关键字和 comment 之间应有一个空格。
ReDim 语句 在过程级中声明动态数组变量并分配或重新分配存储空间。 ReDim [Preserve] varname(subscripts) [, varname(subscripts)]
Randomize 语句 初始化随机数生成器。 Randomize [number] number 参数可以是任何有效的数值表达式。 说明 Randomize 使用 number 参数初始
Public 语句 定义公有变量并分配存储空间。在 Class 块中定义私有变量。 Public varname[([subscripts])][, varname[([subscripts])
Sub 语句 声明 Sub 过程的名称、参数以及构成其主体的代码。 [Public [Default]| Private] Sub name [( arglist )]
Set 语句 将对象引用赋给一个variable或property,或者将对象引用与事件关联。 Set objectvar = {objectexpression | New classname
我有这个代码块,有时第一个 if 语句先运行,有时第二个 if 语句先运行。我不确定为什么会这样,因为我认为 javascript 是同步的。 for (let i = 0; i < dataObje
这是一个 javascript 代码,我想把它写成这样:如果此人回答是,则回复“那很酷”,如果此人回答否,则回复“我会让你开心”,如果此人回答的问题包含"is"或“否”,请说“仅键入”是或否,没有任何
这是我的任务,我尝试仅使用简短的 if 语句来完成此任务,我得到的唯一错误是使用“(0.5<=ratio<2 )”,除此之外,构造正确吗? Scanner scn = new Scanner(
有没有办法在 select 语句中使用 if 语句? 我不能在这个中使用 Case 语句。实际上我正在使用 iReport 并且我有一个参数。我想要做的是,如果用户没有输入某个参数,它将选择所有实例。
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: If vs. Switch Speed 我将以 C++ 为例,但我要问的问题不是针对特定语言的。我的意思是一
Property Set 语句 在 Class 块中,声明名称、参数和代码,这些构成了将引用设置到对象的 Property 过程的主体。 [Public | Private] Pro
Property Let 语句 在 Class 块中,声明名称、参数和代码等,它们构成了赋值(设置)的 Property 过程的主体。 [Public | Private] Prop
我是一名优秀的程序员,十分优秀!