MySQL: Транзакции через несколько потоков

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

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

Цель

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

  1. Я могу реализовать транзакцию через многочисленные связи?
  2. В противном случае несколько потоков могут совместно использовать то же соединение? (Отметьте: существует МНОГО вставок, продолжающихся здесь, и это - требование).
8
задан Zombies 23 March 2010 в 13:03
поделиться

3 ответа

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

-Дон

3
ответ дан 5 December 2019 в 20:15
поделиться

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

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

5
ответ дан 5 December 2019 в 20:15
поделиться

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

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

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

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

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

0
ответ дан 5 December 2019 в 20:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: