Sql server ColdFusion线程中的SQL死锁
我试图弄清楚为什么在线程内执行简单查询时会出现死锁错误。我正在Windows 2012服务器上运行带有SQL Server 2008 R2的CF10 每天一次,我有一个进程在数据库中缓存一堆博客提要。对于每个博客提要,我创建一个线程并在其中完成所有工作。有时它运行正常,没有错误,但有时在一个或多个线程中出现以下错误: [Macromedia][SQLServer JDBC驱动程序][SQLServer]事务(进程ID 57)与另一个进程在锁定资源方面陷入僵局,并且 被选为死锁受害者。重新运行事务 当我运行一个设置标志指示提要正在更新的查询时,就会出现这种死锁情况。显然,此查询可能与正在更新其他提要的其他线程同时发生 根据我的研究,我认为我可以通过在查询周围放置一个独占的命名锁来解决这个问题,但是为什么我需要这样做呢?我以前从未遇到过僵局,所以请原谅我在这个问题上的无知。我怎么可能陷入死锁状态 由于要发布的代码太多,这里有一个粗略的算法:Sql server ColdFusion线程中的SQL死锁,sql-server,coldfusion,sql-server-2008-r2,database-deadlocks,cfthread,Sql Server,Coldfusion,Sql Server 2008 R2,Database Deadlocks,Cfthread,我试图弄清楚为什么在线程内执行简单查询时会出现死锁错误。我正在Windows 2012服务器上运行带有SQL Server 2008 R2的CF10 每天一次,我有一个进程在数据库中缓存一堆博客提要。对于每个博客提要,我创建一个线程并在其中完成所有工作。有时它运行正常,没有错误,但有时在一个或多个线程中出现以下错误: [Macromedia][SQLServer JDBC驱动程序][SQLServer]事务(进程ID 57)与另一个进程在锁定资源方面陷入僵局,并且 被选为死锁受害者。重新运行事务
thread name="#createUUID()#" action="run" idBlog=idBlog {
try {
var feedResults = getFeed(idBlog);
if (feedResults.errorCode != 0)
throw(message="failed to get feed");
transaction {
/* just a simple query to set a flag */
dirtyBlogCache(idBlog); /* this is where i get the deadlock */
cacheFeedResults(idBlog, feedResults);
}
} catch (any e) {
reportError(e);
}
}
} /* thread */
这种方法对我一直很有效
<cffunction name="runQuery" access="private" returntype="query">
arguments if necessary
<cfset var whatever = QueryNew("a")>
<cfquery name="whatever">
sql
</cfquery>
<cfreturn whatever>
</cffunction>
attempts = 0;
myQuery = "not a query";
while (attempts <= 3 && isQuery(myQuery) == false) {
attempts += 1;
try {
myQuery = runQuery();
}
catch (any e) {
}
}
如有必要,请提供论据
sql
尝试次数=0;
myQuery=“非查询”;
虽然(尝试在没有重新编译的情况下,或者至少不知道某些代码是什么样子的情况下,很难对此做出任何合理的解释。此外,还需要一些提示,说明您已经尝试过的补救措施会有所帮助。听起来您可能正在设置标志,表示正在更新源的同一事务中更新源记录。如果是这种情况,请尝试将其移到事务之外。(编辑)关于实际查询、db表结构和索引,上面仍然没有任何内容-因此不可能提供超出猜测的内容。没有一个答案/原因。您需要进行一些跟踪/故障排除(请参阅第一条注释)。不确定跟踪时等待的资源将帮助您回答该问题:)这确实是一个SQL Server问题,因此您需要使用其工具对其进行故障排除。死锁通常是由表锁或页锁冲突造成的,有时是由于索引不足造成的,但也有其他原因。请参阅。但是,在没有至少一个表锁或页锁冲突的情况下,很难提供更多建议。)生成的SQL和b)表DDL。感谢您的建议,我可以看到这是如何工作的。但是,我想知道为什么我的代码会生成死锁条件,因为我非常确定,如果存在死锁,您希望找出原因并修复它,而不是忍受它并编写代码来解决它。谢谢@DanBracuk。由于这是我第一次不得不处理死锁,所以我还不能确定这是SQL Server。我觉得这与我的代码的结构有关,更具体地说是与线程有关。微软花了时间和精力来创建特定的错误消息。此外,启发我提出这种方法的查询是简单的select命令。没有线程,没有事务,只需选择查询。确保线程“涉及”,但对CF服务器的每个请求都涉及线程。这肯定是SQL server的问题。但正如我前面所说,您必须进行一些跟踪和调查,以找出db结构的具体原因。除此之外,除非发布SQL和DDL,否则无法进一步提供帮助。有什么原因你不能发布这些信息吗?@Leigh,我不想让任何人在这上面花那么多时间,这就是为什么我不愿意发布CFC和模式。谢谢你的帮助!