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

时间:2010-11-12 19:31:18

标签: coldfusion

我做了更新,然后尝试恢复更新字段的更新值。但问题是,我没有得到更新的值,而是先前的值。我知道更新工作正常,因为如果我查询它显示返回的数据。我已经尝试过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 个答案:

答案 0 :(得分:2)

你没有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>

希望能让你到达某个地方,如果不是,我认为你需要更多地解释数据库模式。

答案 1 :(得分:1)

除非您使用<cfthread>

,否则ColdFusion不会在并行的同一请求中执行任何操作

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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