Несколько баз данных и транзакций - PullRequest
3 голосов
/ 10 февраля 2010

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

 $conn_site=mysql_connect("localhost", "us", "ps");
 mysql_select_db("site",$conn_site); 
 $conn_forum=mysql_connect("localhost", "us", "ps");
 mysql_select_db("forum",$conn_forum); 

     function begin() {

         @mysql_query("BEGIN",$conn_site);
         @mysql_query("BEGIN",$conn_forum);
     }
    function commit_reg() {
        @mysql_query("COMMIT",$conn_site);
        @mysql_query("COMMIT",$conn_forum);
    }
    function rollback(){
        @mysql_query("ROLLBACK",$conn_site);
        @mysql_query("ROLLBACK",$conn_forum);
    }
   begin();
    mysql_query("insert into users (....) or rollback();
       mysql_query("insert into forumusers (....) or rollback();
    commit();

Ответы [ 3 ]

14 голосов
/ 11 февраля 2010

mysql поддерживает транзакции XA , которые допускают двухэтапную фиксацию, как предлагает Роберт, но более формально. интерфейсы PHP напрямую не поддерживают транзакции XA, поэтому вам придется самостоятельно отправлять команды транзакций в виде операторов.

5 голосов
/ 10 февраля 2010

Это не поможет приседать. Транзакции изолированы в одной «базе данных». Для того чтобы транзакции охватывали несколько баз данных, вам необходимо то, что называется «распределенным управлением транзакциями». Стандарты для этого включают XTA. Более корпоративно-ориентированные фреймворки, включая Java J2EE, включают подобные вещи в стандартную комплектацию.

Поскольку похоже, что вы используете PHP, вам придется, так сказать, развернуть свой собственный. Я предполагаю, что Mysql поддерживает вложенные транзакции (я не знаю). Итак, если внутренние транзакции на двух БД оба успешно выполнены, вы хороши ... зафиксируйте две внешние транзакции. Если какая-либо из внутренних транзакций завершится неудачно, откатите обе внешние транзакции.

1 голос
/ 11 февраля 2010

Что вам действительно нужно сделать, так это использовать одно соединение с базой данных, чтобы использовать обе базы данных.

В MySQL «база данных» действительно больше похожа на «каталог» или «схему» на других серверах. Вы можете использовать таблицы из другой базы данных в том же соединении, которое позволяют разрешения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...