ColdFusion事务和数据并发问题
我在函数顶部的变量中创建并赋值。但不知何故,该值会被其他用户的表记录替换。当两个用户同时使用不同的记录执行事务时,就会发生这种情况。而且这种情况偶尔也会发生一次。 我在下面代码的评论中提到了这个问题ColdFusion事务和数据并发问题,coldfusion,coldfusion-11,Coldfusion,Coldfusion 11,我在函数顶部的变量中创建并赋值。但不知何故,该值会被其他用户的表记录替换。当两个用户同时使用不同的记录执行事务时,就会发生这种情况。而且这种情况偶尔也会发生一次。 我在下面代码的评论中提到了这个问题 <cffunction name="functionname" output="true"> <cfargument name="formData"> <cftransaction action="begin"> <cftry>
<cffunction name="functionname" output="true">
<cfargument name="formData">
<cftransaction action="begin">
<cftry>
<cfquery name="getDoc_no" datasource="#variables.dsn#">
SELECT CONCAT(TO_CHAR(SYSDATE,'YYYY'),WORK_REQ_SEQ.NEXTVAL) as NEXT_NO FROM DUAL
</cfquery>
<cfset doc_no_seq=getDoc_no.NEXT_NO> <!---creating variable doc_no_seq --->
<cfquery name="getWo_no" datasource="#variables.dsn#">
SELECT WORK_ORDER_SEQ.nextval as NEXT_NO FROM DUAL
</cfquery>
<cfset Trns_seq=getWo_no.NEXT_NO> <!--- creating variable Trns_seq --->
<cfquery name="insert1" datasource="#variables.dsn#">
INSERT into WORK_ORDER
(
DOC_NO,
TRANS_ID
)
Values
(
<cfqueryparam value="#doc_no_seq#" cfsqltype="cf_sql_integer">, <!--- Inserted CORRECT doc_no_seq value --->
<cfqueryparam value="#Trns_seq#" cfsqltype="cf_sql_integer"> <!--- Inserted CORRECT Trns_seq value --->
)
</cfquery>
<cfif isdefined("IdnoRes") and IdnoRes gt 0>
<cfloop from="1" to="#IdnoRes#" index="q">
<cfif trim(Evaluate("rsc_grp_id_#q#")) is not "" and trim(Evaluate("qty_#q#")) is not "">
<cfquery name="insert2" datasource="#variables.dsn#">
INSERT into REQ_RESOURCE_DTLS
(
DOC_NO ,
TRANS_ID
)
Values
(
<cfqueryparam value="#doc_no_seq#" cfsqltype="cf_sql_integer">, <!--- Inserted WRONG doc_no_seq value --->
<cfqueryparam value="#Trns_seq#" cfsqltype="cf_sql_integer"> <!--- Inserted WRONG Trns_seq value --->
)
</cfquery>
</cfif>
</cfloop>
</cfif>
<cfif isdefined("Idnojob") and Idnojob gt 0>
<cfloop from="1" to="#Idnojob#" index="q">
<cfif trim(Evaluate("frm_des_#q#")) is not "" and trim(Evaluate("to_des_#q#")) is not "">
<cfquery name="insert3" datasource="#variables.dsn#">
INSERT into JOB_SEQ_DTLS
(
DOC_NO ,
TRANS_ID
)
Values
(
<cfqueryparam value="#doc_no_seq#" cfsqltype="cf_sql_integer">, <!--- Inserted WRONG doc_no_seq value --->
<cfqueryparam value="#Trns_seq#" cfsqltype="cf_sql_integer"> <!--- Inserted WRONG Trns_seq value --->
)
</cfquery>
</cfif>
</cfloop>
</cfif>
<cftransaction action="commit" />
<cfcatch type="any">
<cftransaction action="rollback" />
</cfcatch>
</cftry>
</cftransaction>
<cfreturn 1>
选择CONCAT(TO_CHAR(SYSDATE,'YYYY')、WORK_REQ_SEQ.NEXTVAL)作为DUAL中的下一个编号
从DUAL中选择WORK_ORDER_SEQ.nextval作为下一个编号
插入工单
(
文件编号:,
TRANS_ID
)
价值观
(
,
)
插入到请求资源DTL中
(
文件编号:,
TRANS_ID
)
价值观
(
,
)
插入到作业\u SEQ\u DTL中
(
文件编号:,
TRANS_ID
)
价值观
(
,
)
将所有变量(包括查询名称)保留在函数的本地。您可以使用本地范围或关键字
var
来执行此操作。为了澄清这一点,听起来您正在经历竞争条件。最有可能的情况是,您将组件存储在共享范围内,这意味着函数中声明的任何未正确本地化的变量最终都位于variables
范围内,该范围可供多个线程访问,并受争用条件的约束。解决方案是确保使用local
或var
对所有函数局部变量进行本地化。这包括函数本地的所有变量-循环索引、查询名称-所有变量。另外1)无需使用evaluate()。大多数作用域都是结构,因此请使用结构表示法,即scopeName[“variableName”&index]
2)作用域所有变量,即使用参数。variableName
而不仅仅是variableName
和3)IsDefined()有时范围太广。最好改用structKeyExists()。@DanBracuk非常感谢您。让我试试这个。@Leigh非常感谢您保留函数本地的所有变量,包括查询名称。您可以使用本地范围或关键字var
来执行此操作。为了澄清这一点,听起来您正在经历竞争条件。最有可能的情况是,您将组件存储在共享范围内,这意味着函数中声明的任何未正确本地化的变量最终都位于variables
范围内,该范围可供多个线程访问,并受争用条件的约束。解决方案是确保使用local
或var
对所有函数局部变量进行本地化。这包括函数本地的所有变量-循环索引、查询名称-所有变量。另外1)无需使用evaluate()。大多数作用域都是结构,因此请使用结构表示法,即scopeName[“variableName”&index]
2)作用域所有变量,即使用参数。variableName
而不仅仅是variableName
和3)IsDefined()有时范围太广。最好改用structKeyExists()。@DanBracuk非常感谢您。让我试试这个。@Leigh,非常感谢