我有一件很奇怪的事情发生,似乎无法跟踪它。我有一个简单形式的简单CFM,用户按下提交按钮,页面POSTs自己,然后调用一个带有<cfinvoke>
的CFC函数。正在调用的函数只有一个调用Oracle的<cfstoredproc>
。 Oracle过程应该创建大约3000多条记录。但它创造的数量恰好是这个数字的两倍。我在<cfstoredproc>
调用之前放置了一个<cflog>
,并且创建了2个条目。所以这个功能被第二次以某种方式解雇了。相同的用户,相同的SessionID,不同的ThreadID。我不知道这第二个电话是从哪里来的。ColdFusion - 重复POST被解雇
- 我只按下按钮一次。
- 我看了网络流量,我只看到一个POST。
我把<cflock>
围绕<cfstoredproc>
调用,并解决了这个问题,现在只创建了超过3000个recs。但是现在我得到了这个神秘的第二个电话的锁定超时错误。
另一个奇怪的是<cflock>
超时时间为30秒。但<cflog>
最初只显示1个条目,然后恰好60秒后出现第二个日志条目并发生<cflock>
错误。我将<cflock>
超时下降到15秒,结果仍然相同。为什么这次第二次神秘通话每次都会在第一次之后1分钟记录下来?
我正在运行ColdFusion 10,0,13,287689。
"Severity","ThreadID","Date","Time","Application","Message"
"Information","ajp-bio-8012-exec-9","06/26/14","14:59:34",,"D:\ColdFusion10\cfusion\logs\cbruserwo_cfc.log initialized"
"Information","ajp-bio-8012-exec-9","06/26/14","14:59:34","xxx","USERA // USERA // 1958938 // lockname: B-100139230442054"
"Information","ajp-bio-8012-exec-7","06/26/14","15:00:35","xxx","USERA // USERA // 1958938 // lockname: B-100139230442054" <-- the mysterious one, comes in 1 minute later
"Information","ajp-bio-8012-exec-12","06/26/14","15:08:36","xxx","USERA // USERA // 1958938 // lockname: B-100139230442054"
"Information","ajp-bio-8012-exec-5","06/26/14","15:09:37","xxx","USERA // USERA // 1958938 // lockname: B-100139230442054" <-- the mysterious one, comes in 1 minute later
"Information","ajp-bio-8012-exec-1","06/26/14","15:19:54","xxx","USERA // USERA // 1958938 // lockname: B-100139230442054"
"Information","ajp-bio-8012-exec-7","06/26/14","15:20:57","xxx","USERA // USERA // 1958938 // lockname: B-100139230442054" <-- the mysterious one, comes in 1 minute later
我正在使用的Application.cfc同时与onRequest
和onCFCRequest
方法(与其他常用的放在一起)。
某些代码...
<cfcomponent>
<cffunction name="create" access="public">
...removed some trivial code...
<!--- START: debug this craziness --->
<cflock timeout="30" name="A-#form.cbrorderunid#">
<cfif not isdefined("session.cbruserwo_cfc.calledcnt")>
<cfset session.cbruserwo_cfc.calledcnt = 1>
<cfelse>
<cfset session.cbruserwo_cfc.calledcnt = session.cbruserwo_cfc.calledcnt+1>
</cfif>
<cflog file="cbruserwo_cfc" text="#session.sv.un# // #session.sv.fullname# // #session.sv.csid# // lockname: B-#form.cbrorderunid#">
<cfsavecontent variable="xxx">
<cfoutput>
session.cbruserwo_cfc.calledcnt: #session.cbruserwo_cfc.calledcnt#<br>
CGI: <cfdump var="#cgi#">
FORM: <cfdump var="#form#">
URL: <cfdump var="#url#">
ARGUMENTS: <cfdump var="#arguments#">
</cfoutput>
</cfsavecontent>
<cffile action= "write" file="D:\temp\cbruserwo_cfc.html" addNewLine="no" output="#xxx#">
</cflock>
<!--- END: debug this craziness --->
<!--- The debug code above shows another POST/call/request something being made, but the network traffic shows only 1 POST happening --->
<cflock timeout="30" name="B-#form.cbrorderunid#">
<cfstoredproc>
<!---
This is the call that would do the 3000+ inserts, omitted contents, irrelavent to question.
The cflock around it fixes the duplicate records from being created, but now I get lock timeout
errors from this mysterious second request.
--->
</cfstoredproc>
</cflock>
...removed some trivial code...
</cffunction>
</cfcomponent>
UPDATE ...
有人要求所有的代码有的说不要发布所有的代码,所以我不知道你们想要什么。我承认这是一个奇怪的。我们最近添加了application.cfc-> onRequest函数。不知道这与它有什么关系。但它现在所做的全部是...
<cffunction name="onRequest" access="public">
<cfargument name="TargetPage" type="string" required="true" />
<!--- Make these functions globally accessible --->
<cfset structAppend(url, createObject("component", "lib_globalfunctions"))>
<!--- Include the requested page. --->
<cfinclude template="#ARGUMENTS.TargetPage#" />
</cffunction>
我也检查了所有的Apache ssl_requestlog的,只有一个帖子发生。这就是为什么我没有显示任何我的HTML,表单,按钮,提交代码。
我会尝试翻出所有customtags /专有代码,并提出一个缺陷的裸骨通用复制。如果我能我会重写这个问题并发布。这需要一些时间。只是想知道是否有人听说过这样的错误,看起来像没有人,谢谢。
更多的更新...
它正在越来越不像一个ColdFusion问题。
每个项目符号对于每个用户都是一致的重复项。
- ME - 最新版本的Chrome,第二个神秘的请求发生。
- 其他用户 - 同一建筑物,相同版本的Chrome,无第二次请求。
- ME-IE10,没有第二个请求。
- 其他用户 - 在建筑物外部,IE10发生第二个神秘请求。
将表单处理拆分为单独的文件:form.cfm> form_processing.cfm。然后重定向到form.cfm,如果这是您的工作流程。在该设置下查看代码是否触发两次。此外,您是否使用JavaScript提交表单?我见过JavaScript submit()触发的情况,但正常的表单提交事件也会触发。 –
我不太清楚当你没有发布任何代码时人们应该如何帮助你。?不要描述代码,只需发布它(或者最好是一个证明问题的简化再现案例)。 –
我同意@iKnowKungFoo一旦你分开那头猪,你很可能会发现问题。你也应该把你的代码放在这里,这样我们可以更有效地帮助你。 ;)它也使得一个很好的单元测试能够分解你的代码。只需测试您的表单行为,而不是服务器端事件可以帮助标准化表单。也许你有一个duped form变量,转储出你的表单并像这样终止''我敢打赌,一些谜团将会被揭示。 –