2

cfquery在同一个标​​签中混合使用原始查询和 ORM 操作是否安全cftransaction

<cftransaction>
    <cfquery datasource="test">...</cfqueyr> <!--- A --->
    <cfset var e = entityLoadByPK('SomeEntity', someId)> <!--- B --->
    <cfset e.setSomeProperty('test')> <!--- C --->
    <cfquery datasource="test">...</cfquery> <!--- D --->
</cftransaction>

通过查看 SQL 探查器,查询似乎不会按顺序执行,它们按以下顺序出现在探查器中:A、B、D、C。据我了解,这可能是因为休眠session 只有在到达 close 时才会被刷新cftransaction,对吗?

我注意到由于另一个问题,我将在另一个问题中问一个。但基本上,我必须在运行 ORM 语句之前禁用特定表上的触发器,否则会导致StaleStateException.

DISABLE TRIGGER当在同一个和ENABLE TRIGGER语句之间进行 ORM 操作时cftransaction,它并没有解决问题,因为在ORM 查询之前ENABLE TRIGGER运行。但是,当使用以下内容时,它可以工作:

<cfquery datasource="test">
    DISABLE TRIGGER ALL ON Test;
</cfquery>

<cftransaction>
    <!--- ORM CODE --->
    <!--- Other cfquery --->
</cftransaction>

<cfquery datasource="test">
    ENABLE TRIGGER ALL ON Test;
</cfquery>

我也尝试ormFlush()在 ORM 语句之后立即使用,但没有奏效。有没有办法在同一个中混合原始查询和 ORM 语句cftransaction并让语句按顺序运行?也许我完全误解了这个问题,但我现在很困惑。

4

1 回答 1

0

尝试使用 ORMExecuteQuery。

ORMExecuteQuery("update SomeEntity set SomeProperty = 'test' where id = :id",
  {"id"="someId"});`

这些会立即执行并跳过 ORM 会话。

于 2013-11-21T14:16:00.203 回答