Диспетчер транзакций Spring Datasource: транзакционность между несколькими экземплярами приложения

Учитывая, что все операции БД, которые я выполняю в источнике данных 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) в нужное время.

Какие данные вы видите внутри транзакции (независимо от того, является ли она частью вашего приложения или чьего-то еще), зависит от уровня изоляции транзакции (погуглите;)

person kostya    schedule 22.02.2015

Если несколько копий моего приложения получат запросы на выполнение операций базы данных с одним и тем же источником данных, будут ли операции по-прежнему транзакционными?

Поведение транзакций не контролируется самим источником данных. Источник данных отвечает за создание соединений, а TransactionManager отвечает за управление границами транзакций. Если вы распространяете транзакцию на все операции, то TransactionManager разделит их на одну и ту же транзакцию. На самом деле можно иметь распределенные транзакции (используя двухфазную фиксацию) по разным источникам данных.

Если другой программист подключится к тому же источнику данных, используя другую библиотеку, будут ли выполняемые здесь операции по-прежнему транзакционными?

Клиент не может контролировать транзакцию поставщика услуг.

person Marcelo Keiti    schedule 21.02.2015