代码之家  ›  专栏  ›  技术社区  ›  Darren

ColdFusion并行执行查询(数据不更新)

  •  0
  • Darren  · 技术社区  · 15 年前

    我进行更新,然后尝试获取更新字段的更新值。然而,问题是我没有得到更新的值,而是之前的值。我知道更新工作正常,因为如果我查询它,它会显示返回的数据。我尝试了cftransaction isolation=“serializable”,但它不起作用。

    下面是我的代码,是否有办法解决这个问题,或者我是否需要为simpe问题提出2个AJAX请求?

    <cfquery datasource="#application.datasource#">
    UPDATE gt_timesheet
    SET
        phaseid=<cfqueryparam value="#form.phase#" cfsqltype="CF_SQL_INTEGER">,
        projectid=<cfqueryparam value="#form.project#" cfsqltype="CF_SQL_INTEGER">
    WHERE
        timesheetid=<cfqueryparam value="#form.timesheetid#" cfsqltype="CF_SQL_INTEGER">
    </cfquery>
    
    <cfquery name="phase" datasource="#application.datasource#">
    SELECT status,
    (
        SELECT ROUND(sum(time_to_sec(duration))/3600,2)
        FROM gt_timesheet
        WHERE gt_timesheet.phaseid=gt_phases.phaseid
    ) as billedbillablehours,
    (
        SELECT ROUND(sum(time_to_sec(hours))/3600,2)
        FROM gt_services
        WHERE gt_phases.phaseid=gt_services.phaseid
    ) as billablehours
    FROM gt_phases
    WHERE phaseid=<cfqueryparam value="#form.phase#" cfsqltype="CF_SQL_INTEGER">
    </cfquery>
    

    这让我发疯,因为这种语言不断地让原本应该简单乏味的任务变得乏味。

    4 回复  |  直到 13 年前
        1
  •  2
  •   Saul    15 年前

    您没有CF问题,您有SQL问题,我认为这是子查询。首先,为什么是子查询而不是联接?

    您能否确认它们在子查询中是1:1的关系,因为如果它们是一对多的关系,您只需要获得第一个匹配。

    我不知道您的数据库模式,但按照您目前的方式进行,我认为SELECT需要根据刚刚更新的表单字段进行表匹配

    <cfquery name="phase" datasource="#application.datasource#">
    SELECT status,
    (
        SELECT ROUND(sum(time_to_sec(duration))/3600,2)
        FROM gt_timesheet
        WHERE gt_timesheet.phaseid=<cfqueryparam value="#form.phase#" cfsqltype="CF_SQL_INTEGER">
    ) as billedbillablehours,
    (
        SELECT ROUND(sum(time_to_sec(hours))/3600,2)
        FROM gt_services
        WHERE gt_services.phaseid=<cfqueryparam value="#form.phase#" cfsqltype="CF_SQL_INTEGER">
    ) as billablehours
    FROM gt_phases
    WHERE phaseid=<cfqueryparam value="#form.phase#" cfsqltype="CF_SQL_INTEGER">
    </cfquery>
    

    希望这能让您有所收获,如果不是,我想您需要更多地解释数据库模式。

        2
  •  1
  •   Henry    15 年前

    除非使用 <cfthread>

        3
  •  1
  •   eapen    15 年前

    运行第一条Update语句后,如何更新持续时间?它会触发吗?这可能会导致在第二次查询之后运行“duration”字段的更新。您可以尝试在第一个查询之后添加1秒睡眠,以确保第二个查询获得正确的值。

        4
  •  1
  •   Pradeep    15 年前

    我想你在更新声明中遗漏了一些东西。为什么不再次对查询进行重新评估。

    推荐文章