[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Транзакции в работе одновременно с 2-мя БД
GET
Привет.

Сабж по теме, есть две БД MySQLi одна на локалхосте, другая удаленная, работать с ней предполагаю по SSH тунеллю.

Вопрос вот в чем.

Делаю несколько взаимосвязанных INSERT`ов за один запуск скрипта, делаю с транзакциями. Тестирую на локалхосте, создав две разных БД. Создал для них два разных подключения (через два разных объекта соответственно):

Перед началом операций дублирую:

mysqli1::query("START TRANSACTION");
mysqli2::query("START TRANSACTION");

//INSERT
//INSERT
//UPDATE

дальше также двойной COMMIT или двойной ROLLBACK т.е. для каждого подключения.

Вроде всяко уже потестил, все прекрасно работает.

Вопрос: Есть ли вообще какие-то подводные камни в таком подходе и возможные сложности при работе с удаленной БД?

Спасибо.

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
T1grOK
В твоем варианте, при двух подключениях только так и получится сделать.
А внутри одного подключения, можно делать один TRANSACTION между разыми БД.

_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
GET
T1grOK
Спасибо

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
mvg
Смотря для чего используется 2 разные БД. Если зеркальные копии, тогда нет никаких сложностей. Если предположить что одна БД будет хранить одни данные, другая другие - тогда возникнут сложности с синхронизацией.
GET
Цитата
Проблема будет, если один коммит пройдет, а второй нет.


MiksIr


гм...не совсем понимаю. Если дело дошло до обоих коммитов (т.к. они рядом стоят в одних условиях в одном месте), то строки уже вставились, т.е. они же как бы лишь подтверждают, что все в порядке, а не дают добро.

Это ведь только ROLLBACK дает команду все откатить назад...строки удалить/переобновить.

Как я понимаю во всяком случае.

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
GET
Цитата
Смотря для чего используется 2 разные БД. Если зеркальные копии, тогда нет никаких сложностей. Если предположить что одна БД будет хранить одни данные, другая другие - тогда возникнут сложности с синхронизацией.


Мне кажется в точности наоборот. smile.gif

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

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
GET
Цитата
Банально коннект порвался с удаленной базой, или с субд что-то произошло.


гм...а если так:

if(mysqli1::query("COMMIT"))mysqli2::query("COMMIT");


_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
Aeq
если на одном соединении коммит отвалился, то второй нужно ролбачить. а вот если первый прошел, а второй отвалился, тогда хз
GET
Ну второй все таки на локалхосте....как-то кратно надежнее вроде, от сетки не зависит да и контролировать легче.

В общем всем спасибо. Примерно так и сделаю, как запланировал.

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.