我有两种方法,首先用于插入数据,第二种用于获取插入数据的当前计数。两者都是WCF服务方法。 我需要在数据库中插入批量记录,所以我想检查插入的记录数。为此,我正在使用我的第二种方法。
但不幸的是,除非第一个过程给予回应,否则不会给出回应。我想独立执行这两种方法。我正在使用支持Ajax的WCF服务。 我无法跟踪我的问题,请帮助我。
感谢。
答案 0 :(得分:2)
如果您的插入操作在单个事务中起作用,则其他操作无法查看新记录,直到事务完成。
如果你不介意结果不是100%准确和稳定,你可以选择在read uncomitted
隔离级别运行select(second)操作。
如果这是不可接受的,你可以将你的进度写入另一个表,每隔几行 - 在一个单独的事务中,(新的非嵌套事务范围), 这样选择操作就可以读取它。
答案 1 :(得分:1)
您是从SQL Server中调用它吗?
为什么不在一个单独的线程中运行批量更新,只需快速返回它已排队并正在处理。
我这样做是为了防止使用太多数据库连接,我只是将数据放入队列中,每隔十秒我处理队列中的任何内容。
然后你的第二个功能可以检查状态。
<强>更新强>
我有一个静态类来处理,代码就在最后。基本上,调用进来,我立即返回它已成功放入队列。队列只在后台运行,每十秒检查一次并处理其中的任何内容。
我为队列使用ConcurrentQueue
,以便我可以同时编写和处理。
因此,您可以使用它来开始更新,然后另一个调用可以查看已处理的数量并返回该信息。
public string[] UpdateJobs(Jobs[] jobs)
{
WebServiceControllerStatic.JobQueue = jobs;
WebServiceControllerStatic.ProcessUpdateJobQueue();
List<String> s = new List<String>();
for (int t = 0; t < jobs.Length; t++)
{
s.Add("Success");
}
return s.ToArray();
}
这些在WebServiceControllerStatic类中:
public static Jobs[] JobQueue
{
set
{
try
{
value.AsParallel().ForAll(i => jobqueue.Enqueue(i));
}
catch (Exception e)
{
writeToLog("..\r\n" + e.Message + "\r\n" + e.StackTrace);
}
}
}
public static void ProcessUpdateJobQueue()
{
Action UpdateJob = () =>
{
if (jobqueue.IsEmpty)
return;
Parallel.For(0, jobqueue.Count, new ParallelOptions() { MaxDegreeOfParallelism = 1 },
(j) =>
{
// Do updates here
});
};
if (processUpdateJobThread == null)
{
processUpdateJobThread = new System.Threading.Thread(() =>
{
while (true)
{
UpdateJob();
System.Threading.Thread.Sleep(10000);
}
});
processUpdateJobThread.Start();
}
}
答案 2 :(得分:0)
第二个操作在第一个操作完成之前无法完成,您可以为每个批量插入生成操作键,第二个操作可以使用该键获取插入的记录数。
合同应该是这样的:
Guild DoBulkInsert(string commands);
int? GetCount(Guid bulkId);
答案 3 :(得分:0)
+1。
此外,您还应该考虑使用SqlBulkCopy而不是逐个插入它们。根据我的经验,这将大大提高性能。