Смешайте необработанные запросы и операции ORM в одной и той же cftransaction

Безопасно ли смешивать необработанные запросы с использованием операций 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. Насколько я понимаю, это могло произойти из-за гибернации. сеанс будет очищен только тогда, когда он достигнет закрытия cftransaction, это правильно?

Я заметил это из-за другой проблемы, которую я задам в другом вопросе. Но в основном я должен отключить триггеры для определенной таблицы перед запуском оператора ORM, иначе это приведет к ошибке StaleStateException.

При наличии операции ORM между операторами DISABLE TRIGGER и ENABLE TRIGGER в одном и том же cftransaction это не решило проблему, поскольку ENABLE TRIGGER выполнялось до запроса ORM. Однако при использовании следующего он работает:

<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 и выполнять оператор последовательно? Может быть, я совершенно неправильно понимаю проблему, но сейчас я весьма озадачен.


person plalx    schedule 03.05.2013    source источник
comment
Я бы еще раз присмотрелся к ormFlush(). Я считаю, что это работает, и я использовал его раньше без проблем.   -  person Henry    schedule 03.05.2013
comment
@ Генри, мне придется подождать до понедельника, чтобы перепроверить. Если у вас установлен CF, не могли бы вы подтвердить свое утверждение, вставив 3 строки (без orm, orm, без orm) в таблицу и проверить результат? Спасибо!   -  person plalx    schedule 04.05.2013


Ответы (1)


Попробуйте использовать ORMExecuteQuery.

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

Они выполняются сразу и пропускают сеанс ORM.

person Jan Brünemann    schedule 21.11.2013
comment
Спасибо за совет. Однако я не тратил время на дальнейшее изучение проблемы и проверку правильности моих предположений. Знаете ли вы, как обрабатываются вещи при смешивании необработанных запросов с операциями ORM, а также почему использование ormFlush не сработает в моем случае? В ближайшее время я опубликую дополнительную информацию о проблеме. - person plalx; 21.11.2013