我需要将多个值放入2个数据库中。问题是,如果其中一个INSERTS
失败,我需要所有其他人回滚。
问题
是否有可能同时进行两次交易,将一些值插入数据库,然后Commit
或rollback
这两种情况?
守则
$res = new ResultSet(); //class connecting and letting me query first database
$res2 = new ResultSet2(); //the other database
$res->query("BEGIN");
$res2->query("BEGIN");
try
{
$res->query("INSERT xxx~~") or wyjatek('rollback'); //wyjatek is throwing exception if query fails
$res2->query("INSERT yyy~~")or wyjatek('rollback');
......
//if everything goes well
$res->query("COMMIT");
$res2->query("COMMIT");
//SHOW some GREEN text saying its done.
}
catch(Exception $e)
{
//if wyjatek throws an exception
$res->query("ROLLBACK");
$res2->query("ROLLBACK");
//SHOW some RED text, saying it failed
}
摘要 它是正确的方式,还是会起作用?
所有提示都表示赞赏。
答案 0 :(得分:0)
理论上
如果您要删除
或wyjatek(' rollback')
你的脚本将会有效。
但期待文档
交易在一个"数据库中被隔离"。如果要使用MySql使用多个数据库事务,可以看到XA Transactions。
InnoDB存储支持XA transactions 发动机。
XA支持分布式事务,即允许的能力 多个独立的交易资源参与全球 交易。事务资源通常是RDBMS,但可能是其他资源 各种资源。
应用程序执行涉及不同数据库的操作 服务器,例如MySQL服务器和Oracle服务器(或多个服务器) MySQL服务器),其中涉及多个服务器的操作必须 作为全局事务的一部分而不是单独发生 每个服务器本地的事务。
XA规范。这个 文件由The Open Group出版,可在 http://www.opengroup.org/public/pubs/catalog/c193.htm
答案 1 :(得分:0)
让PostgreSQL做脏工作怎么样?
http://www.postgresql.org/docs/9.1/static/warm-standby.html#SYNCHRONOUS-REPLICATION
答案 2 :(得分:0)
你的建议几乎总能奏效。但对于某些用途,几乎总是'不够好。
如果你有延迟约束,$ res2上的提交可能会在违反约束时失败,然后回滚$ res为时已晚。
或者,您的某个服务器或网络可能在第一次提交和第二次提交之间失败。如果php,database1和database2都在同一硬件上,则此故障模式的窗口非常小,但不可忽略。
如果'几乎总是'不够好,你不能将一组数据迁移到另一个数据库中,然后你可能需要求助于准备好的事务"。