求解、在线等啊、!!

u010360404 2014-04-15 10:06:57
写了这么一个方法、返回的是 sql 语句的。、

   public string ExecLogger(List<string> datakey, List<string> datavalue, string data)
{
string result = "";
lock (allLock)
{
string LOG_FUNC_NAME = datavalue[datakey.FindIndex(s => s.Equals("LOG_FUNC_NAME"))].ToString();
LOG_FUNC_NAME = LOG_FUNC_NAME.StartsWith("<") ? LOG_FUNC_NAME.TrimStart('<').Split('>')[0] : LOG_FUNC_NAME;
string LOG_ID = datavalue[datakey.FindIndex(s => s.Equals("LOG_ID"))].ToString();
//string LOG_ID = "f23c6547-5a60-4469-ae1e-fa479b85f2e4";
string LOG_TYPE = datavalue[datakey.FindIndex(s => s.Equals("LOG_TYPE"))].ToString();
string execlogger = string.Empty;
try
{
this.CreateTable(LOG_FUNC_NAME);
if (LOG_TYPE == "CREATE")
{

if (CheckIsOver(datakey.Count, 13)) return result;
if (CheckRow(LOG_FUNC_NAME, LOG_ID))
{
return result;
}
Thread.CurrentThread.Priority = ThreadPriority.AboveNormal;
string key = string.Empty;
string value = string.Empty;
lock (objbuildsql1)
{
for (int i = 0; i < datakey.Count(); i++)
{
if (datakey[i] == "LOG_TYPE" || datakey[i] == "_TYPE" || datakey[i] == "PE")
{
continue;
}
else
{
key += string.Format("{0}", datakey[i].ToString());
value += string.Format("'{0}'", datavalue[i].ToString().Replace(@"\", @"\\").Replace("\'", "\""));
if (i != datakey.Count() - 1 && datakey[i + 1] != "LOG_TYPE")
{
key += ",";
value += ",";
}
}
}

execlogger = string.Format("insert into {0} ({1}) values ({2});", LOG_FUNC_NAME, key, value);
result = execlogger;


}
}
else if (LOG_TYPE == "UPDATE")
{
if (CheckIsOver(datakey.Count, 12)) return result;
Thread.Sleep(200);
//判断LOG_ID 是否存在
if (!CheckRow(LOG_FUNC_NAME, LOG_ID))
{
lock (objresend)
{
new LogSQS().ReSend(datakey, datavalue);
}
return result;
}
else
{
if (CheckUpdateOutputRow(LOG_FUNC_NAME, LOG_ID))
{
return result;
}
else
{
lock (objbuildsql2)
{
execlogger = string.Format("update {0} set ", LOG_FUNC_NAME);
for (int i = 0; i < datakey.Count(); i++)
{
if (datakey[i] == "LOG_TYPE" || datakey[i] == "_TYPE" || datakey[i] == "PE" || datakey[i] == "LOG_ID")
{
continue;
}
execlogger += string.Format("{0}='{1}'", datakey[i].ToString(), datavalue[i].ToString().Replace(@"\", @"\\").Replace("\'", "\""));
if (i != datakey.Count() - 1 && datakey[i + 1] != "LOG_TYPE")
{
execlogger += ",";
}
}

execlogger += string.Format(" where {0}='{1}';", "LOG_ID", LOG_ID);
result = execlogger;

}
}
}
}
return result;
}
catch (Exception ex)
{
try
{
lock (objwritelog)
{
LogWrapper logWrapper = new LogWrapper();

logWrapper.BuildLogFile("MYSQL.Exec", ex.ToString(), execlogger, data, "", "", "", "", "", "", "", "", "", "", "");
}
}
catch
{
throw;
}
finally
{
lock (objresend)
{
new LogSQS().ReSend(datakey, datavalue);
}
}
return result;
}
}
}


在接收的时候 把sql 语句拼接起来了、
                        string str = logger.ExecLogger(log.DataKey, log.DataValue, log.Data);
if (str == "")
{
return;
}
else
{
sqlCount += str + "\n";
execCount = execCount + 1;
}
if (execCount >50)//如果大于3条,则插入表
{
logger.InsertOrUpdate(sqlCount);
Console.WriteLine("ok----{0}", i++);
execCount = 1;
sqlCount = "";
}
}


但是有一个问题很纠结、总是找不出原因: 要是开单线程就没有问题,可是开了多线程就出现问题了。在上面判断是大于50 条才插入数据库的、按理说这么简单的逻辑应该没问题才对的。可TM 的有时间竟然插入了 49 条数据。、我都无语、 小于50 条怎么可以插入数据库呢,要是插入也是插入50条才对。怎么插入49 呢??、(要是把上面改了大于100,有时间也是插入98 。也有时候99 )。
望大神解答:我都烦死了、这么简单的代码!怎么就出错了。出错了还找不到原因。
...全文
127 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
feiyun0112 2014-04-15
  • 打赏
  • 举报
回复
不仅写要锁,读也要锁
u010360404 2014-04-15
  • 打赏
  • 举报
回复
引用 3 楼 feiyun0112 的回复:
lock(lockobj) { string str = logger.ExecLogger(log.DataKey, log.DataValue, log.Data); if (str == "") { return; } else { sqlCount += str + "\n"; execCount = execCount + 1; } if (execCount >50)//如果大于3条,则插入表 { logger.InsertOrUpdate(sqlCount); Console.WriteLine("ok----{0}", i++); execCount = 1; sqlCount = ""; } }
Thank you very much 。 可是之前我在: else { lock{obj} 我在这里加的时候怎么不行你?? { sqlCount += str + "\n"; execCount = execCount + 1; } }
饕餮123 2014-04-15
  • 打赏
  • 举报
回复
直接insert又没有用事务,中间出错个两三条,多正常
feiyun0112 2014-04-15
  • 打赏
  • 举报
回复
lock(lockobj) { string str = logger.ExecLogger(log.DataKey, log.DataValue, log.Data); if (str == "") { return; } else { sqlCount += str + "\n"; execCount = execCount + 1; } if (execCount >50)//如果大于3条,则插入表 { logger.InsertOrUpdate(sqlCount); Console.WriteLine("ok----{0}", i++); execCount = 1; sqlCount = ""; } }
u010360404 2014-04-15
  • 打赏
  • 举报
回复
引用 1 楼 feiyun0112 的回复:
sql 语句拼接和判断的地方也要加lock
在哪里加??、请解答。。
feiyun0112 2014-04-15
  • 打赏
  • 举报
回复
sql 语句拼接和判断的地方也要加lock

62,072

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧