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,非常感谢