[英]Two transactions on two databases
我需要將多個值放入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
}
總結那么這是正確的方法,還是行得通?
所有提示贊賞。
理論上
如果您要刪除
或wyjatek('rollback')
您的腳本將起作用。
但是尋找文檔
事務被隔離在單個“數據庫”中。 如果要使用MySql使用多個數據庫事務,則可以看到XA Transactions 。
InnoDB存儲引擎可以使用XA事務支持。
XA支持分布式事務,即允許多個單獨的事務資源參與全局事務的能力。 事務性資源通常是RDBMS,但可能是其他類型的資源。
應用程序執行涉及不同數據庫服務器的操作,例如MySQL服務器和Oracle服務器(或多個MySQL服務器),其中涉及多個服務器的操作必須作為全局事務的一部分發生,而不是作為每個服務器本地的獨立事務發生。
XA規范。 本文檔由The Open Group發布,可在http://www.opengroup.org/public/pubs/catalog/c193.htm上找到。
讓PostgreSQL做些骯臟的工作怎么樣?
http://www.postgresql.org/docs/9.1/static/warm-standby.html#SYNCHRONOUS-REPLICATION
您提出的建議幾乎總是可行的。 但是對於某些用途,“幾乎總是”還不夠好。
如果您推遲了約束,則在$ res2上的提交可能會因違反約束而失敗,因此回滾$ res為時已晚。
或者,您的服務器或網絡之一可能在第一次提交和第二次提交之間失敗。 如果php,database1和database2都在同一硬件上,則此故障模式的窗口很小,但不能忽略。
如果“幾乎總是”不夠好,並且您無法遷移一組數據以駐留在另一個數據庫中,那么您可能需要訴諸“准備好的交易”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.