Die Transaktion (Prozess-ID 84) befand sich auf sperren von Ressourcen mit einem anderen Prozess und wurde als Deadlockopfer ausgewählt
Habe ich entwickelt, ein Monitoring-Anwendung. Es gibt also benutzt habe ich eine Timer-Funktion, um zu überprüfen, einige Werte in eine SQL-Tabelle.
aber es gibt so viele Funktion gibt es eine folgende Fehlermeldung für eine Funktion, die aufgerufen wird getLogEntry()
message>Transaction (Process ID 84) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.</message>
<innerMessage>
</innerMessage>
<source>.Net SqlClient Data Provider</source>
<stackTrace>at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
at System.Data.SqlClient.SqlDataReader.HasMoreRows()
at System.Data.SqlClient.SqlDataReader.ReadInternal(Boolean setTimeout)
at ShiftAlertSystem.DBAccess.getLogEntry(Int32 nEventLogIdn, connections cn)</stackTrace>
<createdAt>2012/06/18 13:10:47</createdAt>
Dies ist die Implementierung der Funktion
public LogEntry getLogEntry(int nEventLogIdn, connections cn)
{
lock (_objLock)
{
LogEntry lgEntObj = new LogEntry();
SqlConnection NewCon3 = new SqlConnection();
SqlCommand newCmd2 = null;
SqlDataReader dr = null;
try
{
string connectString;
//Configuration config = ConfigurationManager.u
string DataSource = cryptIT.Decrypt(cn.DataSource_bio);
string initialCatalog = cryptIT.Decrypt(cn.InitialCatalog_bio);
string user = cryptIT.Decrypt(cn.user_bio);
string password = cryptIT.Decrypt(cn.password_bio);
bool intergratedSecurity = cn.IntegratedSecurity_bio;
if (intergratedSecurity)
{
connectString = "Data Source=" + DataSource + ";Initial Catalog=" + initialCatalog + ";Integrated Security=True";
}
else
{
connectString = "Data Source=" + DataSource + ";Initial Catalog=" + initialCatalog + ";User ID=" + user + ";Password=" + password;
}
NewCon3 = new SqlConnection(connectString);
NewCon3.Open();
newCmd2 = NewCon3.CreateCommand();
newCmd2.Connection = NewCon3;
newCmd2.CommandType = CommandType.Text;
newCmd2.CommandText = @"
SELECT [nUserID]
,[sUserName]
,dateadd(s,[nDateTime],'1970/1/1') AS LogDateTime
,[nEventIdn]
,[nTNAEvent]
,[TB_READER].[nReaderIdn]
,[sName]
FROM
[TB_EVENT_LOG]
,[TB_USER]
,[TB_READER]
WHERE
[nEventLogIdn] = " + nEventLogIdn +
@" AND
[TB_EVENT_LOG].[nUserID] = [TB_USER].[sUserID]
AND
[nFlag]= 1
AND
[TB_EVENT_LOG].[nReaderIdn]=[TB_READER].[nReaderIdn]"
;
dr = newCmd2.ExecuteReader();
if (dr != null && dr.Read())
{
lgEntObj.nUserID = dr.GetInt32(0);
lgEntObj.nUserName = dr.GetString(1);
lgEntObj.LogDateTime = dr.GetDateTime(2);
lgEntObj.nEventIdn = dr.GetInt32(3);
lgEntObj.nTNAEvent = dr.GetInt16(4);
lgEntObj.nReaderIdn = dr.GetInt32(5);
lgEntObj.sName = dr.GetString(6);
}
dr.Close();
newCmd2.Dispose();
//NewCon.Close();
NewCon3.Close();
return lgEntObj;
}
catch (Exception exc)
{
CenUtility.ErrorLog.CreateLog(exc);
return null;
}
finally
{
if (dr != null)
dr.Close();
if(newCmd2 != null)
newCmd2.Dispose();
NewCon3.Close();
}
}
}
Vielen Dank im Voraus
- Möchten Sie vielleicht zu prüfen, die Vorschläge in diese Antwort: stackoverflow.com/questions/2382410/.... Haben wir erfolgreich umgesetzt Abfrage-Wiederholungen, wenn die ursprüngliche Abfrage ist festgefahren.
- Auch, wie viele log-Einträge, die Sie schreiben? Wenn Sie schreiben viel, kann es sein, dass Sie nur behindern die WÄHLEN Sie mit einer großen Anzahl von EINSÄTZEN.
- Durch diese Anwendung nichts geschrieben in diese Tabellen, aber auch andere Software schreibt Daten in diese Tabellen.
- Bitte Holen Sie sich die deadlock-Diagramm und fügen Sie diese zu Ihrer Frage. Wenn Sie auf 2008 diese erhalten Sie von der Standard-Extended Events-trace andernfalls müssen Sie die Einrichtung einer Spur, um es einzufangen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Möchten Sie vielleicht, um auf diese Frage für einige weitere hilfreiche Anregungen.
Ich verwenden Sie das folgende Muster für die Datenbank-Wiederholungen; in diesem Fall ist, kehren wir ein DataTable-aber das Muster ist das gleiche, unabhängig; Sie erkennen SqlDeadlock oder Timeout auf der Grundlage der SqlException -Anzahl, und wiederholen Sie, bis zu einer maximalen Anzahl von n-mal.
SqlConnectionBroken = -1, SqlTimeout = -2, SqlOutOfMemory = 701, SqlOutOfLocks = 1204, SqlDeadlockVictim = 1205, SqlLockRequestTimeout = 1222, SqlTimeoutWaitingForMemoryResource = 8645, SqlLowMemoryCondition = 8651, SqlWordbreakerTimeout = 30053
Ihre Abfrage blockiert mit einer anderen Abfrage. Die andere Abfrage ist wahrscheinlich auf eine
insert
,update
oderdelete
Abfrage, daselect
allein nicht dazu neigen, in die Sackgasse.Wenn Sie don ' T care zu viel über Konsistenz, die Sie verwenden können, die
with (nolock)
Hinweis:Führen Sie Ihre Abfrage nicht zu sperren. Eine Abfrage ohne sperren nicht deadlocks führen. Der Nachteil ist, dass es vielleicht zurück inkonsistente Daten, wenn es läuft zur gleichen Zeit wie eine änderung der Abfrage.
alter table
erwirbt eine schemaänderungssperre (Sch-M, schema modification) zu sperren. Einwith (nolock)
gerne Lesen durch einewith (tablockx)