Като се има предвид, че всички DB операции, които извършвам на източник на данни на 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
}