如果我使用两个数据库,我必须开始交易?这是正确的,还是这段代码错了?如果我在第二个查询中出错,那么调用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();
答案 0 :(得分:14)
mysql支持XA transactions,它允许像罗伯特建议的两步提交,但是以更正式的方式。 PHP接口不直接支持XA事务,因此您必须自己发送事务命令作为语句。
答案 1 :(得分:5)
那不会蹲下来。事务在单个“数据库”中被隔离。为了使事务跨越多个数据库,您需要所谓的“分布式事务管理”。这样做的标准包括XTA。更多面向企业的框架,包括Java J2EE,都将此类内容作为标准。
因为看起来你正在使用PHP,所以你可能需要自己动手,可以这么说。我假设Mysql支持嵌套事务(我不知道)。所以,如果两个db上的内部事务都成功,那么你很好......提交两个外部事务。如果任一内部事务失败,则回滚两个外部事务。
答案 2 :(得分:1)
您应该做的是,使用单个数据库连接来使用这两个数据库。
在MySQL中,“数据库”实际上更像是其他服务器中的“目录”或“架构”。您可以在权限允许的同一连接中使用其他数据库中的表。