2013-05-03 3 views
2

Безопасно ли смешивать необработанные запросы с использованием cfquery и ORM-операций в одном и том же теге cftransaction?Смешать необработанные запросы и операции 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 Profiler, то кажется, что запросы не будут выполняться последовательно, они появляются в профилировщика в следующем порядке: A, B, D, C. Из того, что я понимаю, , это может произойти, потому что сеанс спящего режима будет сброшен только тогда, когда он достигнет закрытия cftransaction, это правильно?

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

При наличии операции ORM между DISABLE TRIGGER и ENABLE TRIGGER заявления в том же cftransaction, это не решает проблему, потому что 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 и иметь оператор для выполнения последовательно? Возможно, я полностью недопонимаю этот вопрос, но сейчас я очень озадачен.

+1

Я снова посмотрел бы с 'ormFlush()'. Я считаю, что это работает, и я использовал его раньше, без проблем. – Henry

+0

@ Хенри, мне придется подождать до понедельника, чтобы дважды проверить. Если у вас установлен CF, можете ли вы подтвердить свою инструкцию, вставив в таблицу 3 строки (без orm, orm, без orm) и проверьте результат? Благодаря! – plalx

ответ

0

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

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

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

+0

Спасибо за подсказку. Я не нашел времени для дальнейшего изучения проблемы и проверки того, были ли мои предположения правильными. Вы знаете, как обрабатываются вещи при смешивании необработанных запросов с ORM-операциями, а также почему использование 'ormFlush' woudln't работает в моем случае? В ближайшее время я опубликую дополнительную информацию о проблеме. – plalx

+0

Нет, я бы подумал, что 'ORMFlush' будет делать трюк ... –

Смежные вопросы