MySQL: транзакции в нескольких потоках - PullRequest
8 голосов
/ 22 марта 2010

Предварительный :

У меня есть приложение, которое поддерживает пул потоков из примерно 100 потоков. Каждый поток может длиться около 1-30 секунд, прежде чем новое задание заменит его. Когда поток заканчивается, этот поток почти всегда приводит к вставке 1-3 записей в таблицу, эта таблица используется всеми потоками. Прямо сейчас, никакой транзакционной поддержки не существует, но я пытаюсь добавить это сейчас. Кроме того, рассматриваемая таблица - InnoDB. Итак ...

Цель

Я хочу осуществить транзакцию для этого. Правила того, совершается ли эта транзакция или нет, находятся в главном потоке. В основном есть простая функция, которая будет возвращать логическое значение.

  1. Можно ли осуществить транзакцию через несколько соединений?
  2. Если нет, могут ли несколько потоков использовать одно и то же соединение? (Примечание: здесь происходит много вставок, и это является обязательным требованием).

Ответы [ 3 ]

5 голосов
/ 22 марта 2010

1) Нет, транзакция ограничена одним подключением к БД.

2) Да, соединение (и транзакция) могут совместно использоваться несколькими потоками.

3 голосов
/ 23 марта 2010

Ну, как указано в другом ответе, вы не можете создать транзакцию для нескольких соединений. И вы можете поделиться одним соединением между потоками. Однако Вы должны быть очень осторожны с этим. Вы должны убедиться, что только один поток пишет в соединение одновременно. Вы не можете просто иметь несколько потоков, говорящих через одно и то же соединение, без какой-либо синхронизации их действий. Плохие вещи могут произойти, если вы позволите двум потокам общаться одновременно (повреждения памяти в клиентской библиотеке и т. Д.). Возможно, стоит использовать мьютекс или критическую секцию для защиты разговоров о соединении.

-Don

0 голосов
/ 23 марта 2010

Совместное использование соединений между множеством потоков обычно осуществляется с помощью пула соединений. Каждый поток может запросить соединение из пула, использовать его для своих целей (одна или несколько транзакций, зафиксировано или откатано) и передать его обратно в пул после завершения задачи.

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

Я предлагаю вам взглянуть на Java EE 5 или 6 - он очень прост в использовании и может даже использоваться во встроенных системах. Для легкого начала взгляните на Netbeans и сервер приложений Glassfish. Однако общие понятия применимы ко всем серверам приложений.

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

InnoDB использует MVCC (управление несколькими версиями параллелизма), эффективно представляя каждой транзакции моментальный снимок всей базы данных на момент ее запуска. Вы можете прочитать больше о MVCC здесь в связанном вопросе: Вопрос 812512

...