2010-02-10 6 views
3

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

$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(); 

ответ

5

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

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

+0

правильный с длинным голосом ответ. – 2010-02-11 07:19:59

1

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

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

11

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

+4

Это должен быть признанный ответ! – Benjamin

Смежные вопросы