के रूप में चुना गया है मैंने एक निगरानी अनुप्रयोग विकसित किया है। इसलिए मैंने SQL तालिका में कुछ मानों की जांच करने के लिए टाइमर फ़ंक्शन का उपयोग किया है।लेनदेन (प्रक्रिया आईडी 84) लॉक संसाधनों पर एक और प्रक्रिया के साथ deadlocked था और डेडलॉक पीड़ित
हालांकि वहाँ इतने सारे समारोह कर रहे हैं यह 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>
इस समारोह के कार्यान्वयन है
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();
}
}
}
अग्रिम धन्यवाद देता
आप इस उत्तर में दिए गए सुझावों पर विचार करना चाहते हो सकता है: http://stackoverflow.com/questions/2382410/sql-server-deadlock-fix-force-join-order-or-automatically-retry। यदि मूल क्वेरी डेडलॉक की गई है तो हमने क्वेरी रीट्रीज़ सफलतापूर्वक कार्यान्वित की है। – dash
इसके अलावा, आप कितने लॉग प्रविष्टियां लिख रहे हैं? यदि आप बहुत कुछ लिख रहे हैं, तो हो सकता है कि आप बड़ी संख्या में INSERTS के साथ चयन को रोक रहे हों। – dash
इस एप्लिकेशन द्वारा उन तालिकाओं में कुछ भी लिखा नहीं गया है, लेकिन एक और सॉफ्टवेयर उन तालिकाओं में डेटा लिखता है। –