簡體   English   中英

兩個數據庫上的兩個事務

[英]Two transactions on two databases

我需要將多個值放入2個數據庫中。 問題是,如果其中的一個INSERTS失敗,我需要的所有其他回滾。

問題是否可能同時進行兩個事務,將一些值插入數據庫,然后Commitrollback它們兩者?

編碼

$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上找到。

您提出的建議幾乎總是可行的。 但是對於某些用途,“幾乎總是”還不夠好。

如果您推遲了約束,則在$ res2上的提交可能會因違反約束而失敗,因此回滾$ res為時已晚。

或者,您的服務器或網絡之一可能在第一次提交和第二次提交之間失敗。 如果php,database1和database2都在同一硬件上,則此故障模式的窗口很小,但不能忽略。

如果“幾乎總是”不夠好,並且您無法遷移一組數據以駐留在另一個數據庫中,那么您可能需要訴諸“准備好的交易”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM