2013-06-03 2 views
0

Я ищу разработку структуры транзакций, которая должна обновлять таблицы базы данных одновременно.Java Concurrent Update для нескольких таблиц С поддержкой транзакций

Простыми словами, одна транзакция должна обновлять одновременно около 8 независимых таблиц, и вся транзакция должна завершиться неудачно, если возникла какая-либо ошибка с обновлением.

Есть ли способ, что я могу справиться с этим одновременно,

Т.е., 10 Темы обновления 10 таблиц и если обновление не все обновления, следует откатить.

Есть ли какие-либо рамки, которые позволяют мне обрабатывать этот сценарий.

Если вы используете транзакцию JTA или Spring, которая будет использоваться одним и тем же соединением и будет преследовать цель одновременного обновления.

Или любым способом я могу написать, используя пользовательское решение на основе потоков.

+0

http://stackoverflow.com/questions/6952294/how-to-share-one-transaction -between-multi-threads? rq = 1 «Несколько потоков могут одновременно быть связаны с одной и той же глобальной транзакцией». - JTA spec v1.1, раздел 3.2, стр. 13. – user2413742

ответ

0

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

Это похоже на необычно сконфигурированную распределенную транзакцию для меня, и моей первой попыткой было бы использовать Spring и/или Hibernate. Я думаю, вам просто нужно будет убедиться, что вы рассматриваете транзакции как распределенные транзакции.

0

Рамка JTA.

Это зависит от вашей базы данных, можно ли использовать соединение для всех потоков. Детали можно найти here. Поэтому в общем случае вам нужно подключение для каждого потока.

Если вы используете источник данных XA, вы можете попытаться запустить параллельные потоки под управлением транзакции JTA.

Это сложная задача, и для подготовки потоков требуется время, поэтому, вероятно, это полезно, если обновления занимают много времени, затронутые таблицы являются независимыми и у вас достаточно процессоров на вашем сервере базы данных.

Update

Что касается распространения сделки, here вы можете найти некоторые мысли о ней.

+0

Спасибо Бериллиум. – user2413742

+0

Несколько потоков могут одновременно ассоциироваться с одной и той же глобальной транзакцией ». - JTA spec v1.1, раздел 3.2, стр. 13. – user2413742

+0

Извините, если я должен обновить свой ответ, добавив эту цитату или это вопрос? – Beryllium

0

Вы можете использовать стандартный JDBC. JDBC позволяет вам использовать одно соединение между несколькими потоками. Чтобы сделать несколько потоков в одной транзакции, вы должны

  • создать java.sql.Подключение/или взять его из бассейна
  • очередь Autocommit от
  • прогонов параллельных задач с одной и той же связи
  • ждать задач, чтобы закончить
  • совершить, если все задачи успешно завершена; откатить иначе
  • тесная связь

Также можно использовать Spring JDBC, если вы используете Spring в SingleConnectionDataSource

+0

Спасибо, Евгений Дорофеев. нормальное решение для транзакций с несколькими таблицами и не адресует часть параллелизма.Если вы используете одно и то же соединение, вся цель параллелизма исчезнет. JDBC будет сериализоваться и будет обновляться только последовательно. – user2413742

+0

Если вы считаете, что если задача 2 stmt.executeUpdate будет заблокирован до тех пор, пока задача 1 stmt.executeUpdate не вернет вам ошибку. Проверьте это. –