多个客户端同一时刻执行相同的数据库操作,发生死锁
halo 我们做了一组客户端(大约三十个),第天凌晨同一时刻按城市更新当天的数据,这时候经常报一个死锁的异常,我们解决了这个问题,但感觉不保险,如果客户端的量大到一定程序,这个问题还是会出现的,所以向各个求助有没有更好好的解决办法。
using (SqlConnection conn = new SqlConnection("..."))
{
SqlTransaction tran = null;
try
{
conn.Open();
tran = conn.BeginTransaction();
ExecuteNonQuery("update tabA set ..."); // 按主键更新一行数据
StringBuilder sb = new StringBuilder();
sb.Append("delete from tab4 where city=@City;");
sb.Append("delete from tab3 where city=@City;");
sb.Append("delete from tab2 where city=@City;");
sb.Append("delete from tab1 where city=@City;");
ExecuteNonQuery(tran, sb.ToString(), parameter); // 这里异常
SqlBulkCopyData(tran, datatable1, "tab1");
SqlBulkCopyData(tran, datatable2, "tab2");
SqlBulkCopyData(tran, datatable3, "tab3");
SqlBulkCopyData(tran, datatable4, "tab4");
tran.Commit();
return true;
}
catch (Exception ex)
{
if (tran != null)
tran.Rollback();
LogHelper.RecordErrorLog(ex);
return false;
}
}
记录时间:2013-10-31 03:00:10
- 程序集名称:.Net SqlClient Data Provider
- 发生异常的方法:Void OnError(
System.Data.SqlClient.SqlException, Boolean)
- 错误信息:事务(进程 ID 78)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。
- 堆栈信息:
在
System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
在 System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
在 System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
在 System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
在 Syste