多个客户端同一时刻执行相同的数据库操作,发生死锁
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