AbstractRoutingDataSource и транзакционные менеджеры - PullRequest
1 голос
/ 08 декабря 2011

В настоящее время у меня есть программа, которая имеет два источника данных. Каждый источник данных привязан к одному диспетчеру транзакций.

<bean id="tM" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="ds1" />
</bean>

<bean id="tM2" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="ds2" />
</bean>

Если бы у меня была функция, которая обращается как к источнику данных, так и произошла ошибка, если откат одного источника данных приведет к откату второго источника данных?

Спасибо!

Ответы [ 3 ]

1 голос
/ 09 декабря 2011

Spring не может откатить зафиксированный JDBC-статус.Это то, для чего нужны XADataSources и двухфазная фиксация (обычно через JTA TX manager).

Вы запрашиваете несогласованность данных, пытаясь справиться с этим самостоятельно, потому что это может работать, а может и не работать, в зависимости от того, что и когда не получается.Например, предположим, что этот поток:

  • Start TX
  • Работать с DS1
  • Работать с DS2
  • Конец TX
    • commit ds2
    • commit ds1

Если коммит на ds1 завершится неудачно, то ds2 останется зафиксированным.Но если фиксация на ds2 завершится неудачно, весь tx потерпит неудачу и ds1 откатится.

Кроме того, вы уверены, что всегда закрываете источники данных в том же порядке, в котором они были открыты (впервые использовались)?Весна может позаботиться об этом, но я не уверен.

1 голос
/ 08 декабря 2011

Если ваша функция обращается к хранилищам данных последовательно (я имею в виду, что она делает COMMIT для первого хранилища данных и пытается выполнить COMMIT для второго), то если ошибка возникает после первого COMMIT, второй источник данных будет выполнять ROLLBACK, но сначала - оставаться COMMITED

Итак, вы должны использовать одно хранилище данных или JTATransactionManager.

0 голосов
/ 09 декабря 2011

Автокоммит может быть включен по умолчанию. Попробуйте отключить это и управлять коммитами самостоятельно.

...