Spring Datasource мениджър на транзакции: транзакционност в множество екземпляри на приложение

Като се има предвид, че всички 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 callingtxTemplate.execute(new TransactionalCallBack[T] {...}`. Това ми позволява да декларирам метод като транзакционен по следния начин:

def foo = transactional() {
  //jdbcTemplate operations
}

person Siddhu    schedule 20.02.2015    source източник


Отговори (2)


Транзакциите се изпълняват от базата данни (Oracle във вашия случай), а не от пролетта. Spring го скрива много добре зад много класове, но по същество просто извиква JDBC методи за свързване (setAutoCommit, commit и rollback) в правилните моменти.

Какви данни виждате в транзакция (без значение дали са част от вашето приложение или нечие друго) зависи от нивото на изолация на транзакцията (google it;)

person kostya    schedule 22.02.2015

Ако множество копия на моето приложение получат заявки за извършване на операции с база данни на един и същ източник на данни, операциите ще продължат ли да бъдат транзакционни?

Транзакционното поведение не се контролира от самия източник на данни. Източникът на данни е отговорен за създаването на връзки, докато TransactionManager е отговорен за управлението на границите на транзакциите. Ако разпространявате транзакцията към всички операции, тогава TransactionManager ще ги раздели в една и съща транзакция. Всъщност е възможно да има разпределени транзакции (използвайки двуфазов ангажимент) върху отделни източници на данни.

Ако друг програмист се свърже със същия източник на данни, използвайки различна библиотека, операциите, извършени тук, все още ли ще бъдат транзакционни?

Клиентът не може да контролира транзакцията на доставчика на услуги.

person Marcelo Keiti    schedule 21.02.2015