Безопасно ли смешивать необработанные запросы с использованием операций 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
и выполнять оператор последовательно? Может быть, я совершенно неправильно понимаю проблему, но сейчас я весьма озадачен.
ormFlush()
. Я считаю, что это работает, и я использовал его раньше без проблем. - person Henry   schedule 03.05.2013