Мне было очень трудно подчинить транзакционное поведение в Grails своей воле.Я уверен, что частью проблемы является наш несколько запутанный уровень обслуживания.В некоторых случаях у нас есть стеки вызовов, которые выглядят следующим образом: controller -> service1 -> service2 -> service3.
В любом случае, мой конкретный вопрос здесь заключается в том, что при попытке "что-нибудь сделать, чтобы это работало"Я пометил MyService как @Transactional (распространение = REQUIRED), но установил флаг транзакции в false.Теперь я вижу транзакцию, созданную для вызова myService.getMetaClass ().Я знаю, что эта конкретная конфигурация странная и, вероятно, не рекомендуется, но это все еще кажется мне неправильным поведением.Как я могу предотвратить эту постороннюю транзакцию?
Код:
class MyController {
def myService
def index = {
myService.myMethod()
}
}
@Transactional(propagation = REQUIRED)
class MyService {
static transactional = false
@Transactional(propagation = SUPPORTS)
void myMethod() {
// do stuff...
}
}
Выход журнала:
2011-05-18 09:43:48,056 TRACE ionSynchronizationManager: Retrieved value [org.springframework.orm.hibernate3.SessionHolder@453b8cfd] for key [org.hibernate.impl.SessionFactoryImpl@81560cc] bound to thread [http-8081-1]
2011-05-18 09:43:48,056 DEBUG ansaction.JDBCTransaction: begin
2011-05-18 09:43:48,056 DEBUG te.jdbc.ConnectionManager: opening JDBC connection
2011-05-18 09:43:48,254 DEBUG ansaction.JDBCTransaction: current autocommit status: true
2011-05-18 09:43:48,255 DEBUG ansaction.JDBCTransaction: disabling autocommit
2011-05-18 09:43:48,259 TRACE ibernate.jdbc.JDBCContext: after transaction begin
2011-05-18 09:43:48,259 TRACE ionSynchronizationManager: Bound value [org.springframework.jdbc.datasource.ConnectionHolder@2e317c72] for key [org.springframework.jdbc.datasource.DriverManagerDataSource@26767bef] to thread [http-8081-1]
2011-05-18 09:43:48,259 TRACE ionSynchronizationManager: Initializing transaction synchronization
2011-05-18 09:43:48,259 TRACE or.TransactionInterceptor: Getting transaction for [MyService.getMetaClass]
2011-05-18 09:43:48,259 TRACE or.TransactionInterceptor: Completing transaction for [MyService.getMetaClass]
2011-05-18 09:43:48,259 DEBUG ansaction.JDBCTransaction: commit
2011-05-18 09:43:48,259 TRACE ibernate.impl.SessionImpl: automatically flushing session
2011-05-18 09:43:48,259 TRACE ractFlushingEventListener: flushing session
...
A whole lot of Hibernate session flushing logs...