mysql 分布式事務(xa)

2021-06-16 08:09:00 字數 2760 閱讀 4296

這是寫的乙個測試分布式事務的指令碼,參考了網上的乙個指令碼,但是那個在我這裡指令碼不能正常執行,就自己改了一下

<?php

$mapfarm = new mysqli("10.128.51.121","public","public","db1")or die("$mapfarm :  連線失敗");

$map     = new mysqli("10.128.51.121","public","public","db2")or die("$map     :  連線失敗");

$grid = uniqid("");

$map->query("xa start '$grid'");//準備事務1

$mapfarm->query("xa start '$grid'");//準備事務2

try

$return = $mapfarm->query("update test_transation1 set name='胡代榮' where id=1");//第二個分支事務準備做的事情,通常他們會記錄進日誌

if($return == false)

$map->query("xa end '$grid'");

$map->query("xa prepare '$grid'");

$mapfarm->query("xa end '$grid'");

$mapfarm->query("xa prepare '$grid'");//通知是否準備提交

$mapfarm->query("xa commit '$grid'");//這兩個基本同時執行

$map->query("xa commit '$grid'");

} catch (exception $e)

$map->query("xa start '$grid'");

$sql = "select * from test_transation2 where id=2";

$result = $map->query($sql) or  die("查詢失敗");

echo "

";

print_r(mysqli_fetch_assoc($result));

echo "

";

$map->query("xa end '$grid'");

$map->query("xa prepare '$grid'");

$map->query("xa commit '$grid'");

$mapfarm->query("xa start $grid");

$sql="insert into test_transation1 values(4,'小虎')";

$result = $mapfarm->query($sql) ;

$sql="select * from test_transation1";

$result = $mapfarm->query($sql) or  die("查詢失敗");

echo "

";

print_r(mysqli_fetch_assoc($result));

echo "

";

$mapfarm->query("xa end $grid");

$mapfarm->query("xa  prepare $grid");

$mapfarm->query("xa commit $grid");

$map->close();

$mapfarm->close();

輸出 如下

array

( [id] => 2

[name] => 張巨集

)

array

( [id] => 1

[name] => 胡代榮

)$grid 的值是取得當前的時間的乙個整數值,在用分布式事務之前需要啟動innodb_support_xa 以支援分布式事務

mysql> show variables lik

+-------------------+----

| variable_name     | val

+-------------------+----

| innodb_support_xa | on

+-------------------+----

1 row in set (0.00 sec)

上面例子中其實是啟動的乙個事務,但是看起來有點像多個,我們姑且把他們稱為組建。

要執行乙個全域性事務,必須知道涉及到了哪些元件,並且把每個元件引到一點,在此時,元件可以被提交或回滾時。根據每個元件報告的有關元件效能的內容,這些元件必須作為乙個原子性群組全部提交或 回滾。即,要麼所有的元件必須提交,要麼所有的元件必須回滾。要管理乙個全域性事務,必須要考慮任何元件或連線網路可能會故障。

用於執行全域性事務的過程使用兩階段提交(2pc),發生時間在由全域性事務的分支進行的行動已經被執行之後。

1.    在第一階段,所有的分支被預備好。即,它們被tm告知要準備提交。通常,這意味著用於管理分支的每個rm會記錄對於被穩定儲存的分支的行動。分支指示是否它們可以這麼做。這些結果被用於第二階段。

2.    在第二階段,tm告知rms是否要提交或 回滾。如果在預備分支時,所有的分支指示它們將能夠提交,則所有的分支被告知要提交。如果在預備時,有任何分支指示它將不能提交,則所有分支被告知 回滾。

分布式事務也有他的侷限,它對網路貸款要求比較高,如果所有的mysql 資料庫在同乙個伺服器那麼久沒有什麼影響,但是如果分布在不同的區域網,那麼可能經常因為網路延遲導致事務失敗。

上面例子中其實是啟動的乙個事務

分布式 (XA)事務

在談到 xa規範之前,必須首先了解分布式事務處理 distributed transaction processing dtp 的概念。transaction 即事務,又稱之為交易,指乙個程式或程式段,在乙個或多個資源如 資料庫 或檔案上為完成某些功能的執行過程的集合。分布式事務處理是指乙個事務可能...

分布式事務XA

當資料庫單錶一年產生的資料超過1000w,那麼就要考慮分庫分表,具體分庫分表的原理在此不做解釋,以後有空詳細說,簡單的說就是原來的乙個資料庫變成了多個資料庫。這時候,如果乙個操作既訪問01庫,又訪問02庫,而且要保證資料的一致性,那麼就要用到分布式事務。所謂的soa化,就是業務的服務化。比如原來單機...

XA 分布式事務

在談到 xa 規範之前,必須首先了解分布式事務處理 distributed transaction processing dtp 的概念。transaction 即事務,又稱之為交易,指乙個程式或程式段,在乙個或多個資源如資料庫 或檔案上為完成某些功能的執行過程的集合。分布式事務處理是指乙個事務可能...