Учитывая, что все операции БД, которые я выполняю в источнике данных Oracle (с использованием JDBCTemplate
), выполняются с использованием шаблона транзакции, который использует Spring Datasource TransactionManager,
- Если несколько копий моего приложения получат запросы на выполнение операций базы данных с одним и тем же источником данных, будут ли операции по-прежнему транзакционными?
- Если другой программист подключится к тому же источнику данных, используя другую библиотеку, будут ли выполняемые здесь операции по-прежнему транзакционными?
Чтобы проиллюстрировать, что именно я делаю:
val txTemplate = new TransactionTemplate(txManager, txAttribute)
txTemplate.execute(func)
где func
— это функция, которая выполняет фактические вызовы JDBCtemplate
, txManager
— это менеджер транзакций, а txAttribute
— это DefaultTransactionAttribute
, где я определяю изоляцию, распространение, тайм-ауты и т. д.
Менеджер транзакций — это синглтон, определенный в Spring, который принимает мой источник данных в качестве аргумента.
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<constructor-arg ref="dataSource"/>
</bean>
<bean id="dataSource" class="oracle.jdbc.pool.OracleConnectionPoolDataSource">
...
</bean>
Примечание.
Когда я пишу это на Scala, я определил имплициты, которые оборачивают функцию func
внутри TransactionCallback
вот так:
implicit def txCallbackImplicit[T](func: => T): TransactionCallback[T] = {
new TransactionCallback[T] {
def doInTransaction(status: TransactionStatus) = func.asInstanceOf[T]
}
}
Итак, txTemplate.execute(func) is actually calling
txTemplate.execute(new TransactionalCallBack[T] {...}`. Это позволяет мне объявить метод как транзакционный следующим образом:
def foo = transactional() {
//jdbcTemplate operations
}