1. 程式人生 > >php + mysql 分散式事務(xa)

php + mysql 分散式事務(xa)

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


<?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 = $map->query("UPDATE test_transation2 SET name='張巨集' WHERE id=2") ;//第一個分支事務準備做的事情,通常他們會記錄進日誌
if($return == false) {
throw new Exception("<a href='http://'>113更新失敗!</a>");
}
$return = $mapfarm->query("UPDATE test_transation1 SET name='胡代榮' WHERE id=1");//第二個分支事務準備做的事情,通常他們會記錄進日誌
if($return == false) {
throw new Exception("116更新失敗!");
}


$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) {
$mapfarm->query("XA ROLLBACK '$grid'");
$map->query("XA ROLLBACK '$grid'");
print $e->getMessage();
}


$map->query("XA START '$grid'");


$sql = "SELECT * FROM test_transation2 WHERE id=2";
$result = $map->query($sql) or die("查詢失敗");
echo "<pre>";
print_r(mysqli_fetch_assoc($result));
echo "</pre>";


$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 "<pre>";
print_r(mysqli_fetch_assoc($result));
echo "</pre>";
$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 資料庫在同一個伺服器那麼久沒有什麼影響,但是如果分佈在不同的區域網,那麼可能經常因為網路延遲導致事務失敗。


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










下邊是自己寫的。


<?php


/**


*XA MYSQL


**/


//連線資料庫










//$grid = uniqid("");


//echo $grid;exit;






function getConnect(){


 $con = mysql_connect("localhost","root","root") or die("連線資料庫失敗1");


 mysql_select_db("mysql",$con) or die("找不到資料來源1");


 mysql_query("set names gb2312");


 


}


//連線資料庫1


function getConnect1(){


 $con = mysql_connect("localhost","root","root") or die("連線資料庫失敗1");


 mysql_select_db("vipstore",$con) or die("找不到資料來源2");


 mysql_query("set names gb2312");


 


}










$sql ="INSERT INTO `mysql`.`help_category` (


`help_category_id` ,


`name` ,


`parent_category_ids` ,


`url`


)


VALUES (


'38', 'lfq', '1', '/uuuuullllll'


);


";










$sql2 = "INSERT INTO `vipstore`.`test` (


`id` ,


`val`


)


VALUES (


NULL , 'lfq'


);";










function ReadyTransaction1(){


getConnect();


$result = mysql_query("XA START '$grid'");//準備事務1


return $result;


}






function ReadyTransaction2(){


getConnect1();


$result = mysql_query("XA START '$grid'");//準備事務2


return $result;


}










function getQuery1($sql){


 getConnect();


 $result = mysql_query($sql);


 return $result;


}






function getQuery2($sql){


 getConnect1();


 $r = mysql_query($sql);


 return $r;


}










$grid = uniqid("");


getQuery1("XA START '$grid'");//準備事務1


getQuery2("XA START '$grid'");//準備事務2


 


try{


 $r = getQuery1($sql);


  if($r == false){


    throw new Exception("資料1執行失敗");


  }


 


 $r = getQuery2($sql2);


  if($r == false){


   throw new Exception("資料2執行失敗");


  }


getQuery1("XA END '$grid'");


getQuery1("XA PREPARE '$grid'");






getQuery2("XA END '$grid'");


getQuery2("XA PREPARE '$grid'");//通知是否準備提交






getQuery2("XA COMMIT '$grid'");//這兩個基本同時執行


getQuery1("XA COMMIT '$grid'");






}catch(Exception $e){


getQuery1("XA ROLLBACK '$grid'");


getQuery2("XA ROLLBACK '$grid'");


print $e->getMessage();






}






?>

相關推薦

php + mysql 分散式事務xa

這是寫的一個測試分散式事務的指令碼,參考了網上的一個指令碼,但是那個在我這裡指令碼不能正常執行,就自己改了一下 <?php $mapfarm = new mysqli("10.128.51.121","public","public","db1")or die("$mapfarm : 連線失敗"); $

深入理解分散式事務XA及rocketmq事務

深入理解分散式事務(XA及rocketmq事務) 釋出時間:2018-04-16 來源:網路 上傳者:使用者 關鍵字: 事務 分散式 RocketMq 深入 理解 發表文章 摘要:本文由碼農網–吳極心原創,轉載請看清文末的轉載要求

最快最簡單的部署本地Apache+PHP+MySQL神器USBWebserver

包含 .com col 最快最簡單 dmi 分享圖片 admin 目錄 www. 搭建本地服務器環境的軟件有很多,比如什麽PHPNOW、Almp、XAMPP等等好多;<br> 之前分享過一個《網站本地搭建PHP+Mysql環境運行網站教程》用是PHPno

啟發:從MNS事務訊息談分散式事務

啟發:從MNS事務訊息談分散式事務 事務訊息本質上解決的問題是業務系統與訊息系統之間的事務問題(跨系統分散式事務),其基本原理即兩階段提交以及最終一致性保障。最近看了下阿里雲mns事務訊息的實現原理,介紹的蠻簡潔透徹的,對了解分散式事務實現原理挺有幫助,在閱讀本文前推薦大家先仔細閱讀下阿里雲"m

PHP MySQL 持久連線mysql_pconnect

PHP MySQL 持久連線(mysql_pconnect) 先來一段 PHP 連線 MySQL 的經典程式碼: 1 2 3 4 5 6 7 8 <?php $con = mysql_connect("localhost", "root", "1

分散式事務Spring事務傳播行為

public class ServiceA { @Autowired private ServiceB b; @Transactional public void method() { // 資料庫操作

分散式事務事務的隔離級別

事務的ACID **Atomic:**原子性,一堆SQL,要麼都成功,要麼都不執行,不允許一部分SQL執行成功,一部分SQL執行失敗。 **Consistency:**一致性,在一堆SQL執行之前,資料必須是正確的,執行之後,資料也必須是準確的。 **Isolation:**隔離

分散式事務1訊息傳送一致性解決方案

訊息傳送一致性 是指產生訊息的業務動作與訊息傳送的一致。(如果業務操作成功,那麼由這個業務操作所產生的訊息一定要成功投遞出去,否則就丟訊息) 訊息傳送一致性如何保障: 場景: 1.業務處理成功,執行傳送訊息的時候 應用故障,導致沒有傳送訊息(後續服務沒有收到訊息處理業務

基於可靠訊息方案的分散式事務:Lottor使用

前面兩篇文章介紹了筆者關於可靠訊息方案的分散式事務的實現思路以及Java中的事務概念,奈何工作抽不出時間,如今時隔已久,分散式事務系列拖了很久,一直沒能好好把專案和文章整理一下,實在心裡有愧。 Lottor介紹 Lottor用於解決微服務架構下分散式事務的問題,基於可靠性訊息事務

windows下php+mysql+apache配置

首先分別下載Apache、mysql與php: 從PHP5.2.10版本開始,有None-Thread Safe與Thread Safe兩種版本的可供選擇,這兩種版本有何不同,作為使用者來說又應該如何選擇呢? 先從字面意思上理解,None-Thread

什麼是分散式事務分散式事務特性、2PC、3PC

但是如果第三階段的確認訊息傳送失敗了怎麼辦?RocketMQ會定期掃描訊息叢集中的事物訊息,如果發現了prepare狀態的訊息,它會向訊息傳送者確認本地事務是否已執行成功,如果成功是回滾還是繼續傳送確認訊息呢。RocketMQ會根據傳送端設定的策略來決定是回滾還是繼續傳送確認訊息。這樣就保證了訊息傳送與本地事

php + mysql 分散式事務

事務(Transaction)是訪問並可能更新資料庫中各種資料項的一個程式執行單元; 事務應該具有4個屬性:原子性、一致性、隔離性、持續性 原子性(atomicity)。一個事務是一個不可分割的工作單位,事務中包括的諸操作要麼都做,要麼都不做。 一致性(c

Asp.Net 自帶的分散式事務TransactionScope的程式碼塊

using (TransactionScope scope = new TransactionScope()) { //建立事物物件 try { //執行事務操作的相關程式碼 scope.Complete(); /

基於可靠訊息方案的分散式事務:Java中的事務

前言:在上一篇文章 基於可靠訊息方案的分散式事務:Lottor介紹 中介紹了常見的分散式事務的解決方案以及筆者基於可靠訊息方案實現的分散式事務元件Lottor的原理,並展示了應用的控制檯管理。在正式介紹Lottor的具體實現之前,本文首先將會介紹Java中的事務

詳解Mysql分散式事務XA跨資料庫事務查詢快取

在開發中,為了降低單點壓力,通常會根據業務情況進行分表分庫,將表分佈在不同的庫中(庫可能分佈在不同的機器上)。在這種場景下,事務的提交會變得相對複雜,因為多個節點(庫)的存在,可能存在部分節點提交失敗的情況,即事務的ACID特性需要在各個不同的資料庫例項中保證。比如更新db1

MySQL分散式XA事務

本文內容來自《高效能MySQL》,自己整理了一下。   儲存引擎的事務特效能夠保證在儲存引擎級別實現ACID。而分散式事務則讓儲存引擎級別的ACID可以擴充套件到資料庫層面,甚至可以擴充套件到多個數據庫之間--這需要兩階段提交實現。MySQL5.0和更新版本的資料庫已經開

詳解Mysql分散式事務XA跨資料庫事務

在開發中,為了降低單點壓力,通常會根據業務情況進行分表分庫,將表分佈在不同的庫中(庫可能分佈在不同的機器上)。在這種場景下,事務的提交會變得相對複雜,因為多個節點(庫)的存在,可能存在部分節點提交失敗的情況,即事務的ACID特性需要在各個不同的資料庫例項中保證。

MySQL鎖和事務:InnoDB鎖MySQL 官方文檔粗翻

空間索引 系統 聚集索引 rds update 能夠 conf 沒有 得到   // 寫在前面,實際上,數據庫加鎖的類型和範圍受到多種因素的影響,例如數據庫隔離等級,SQL語句,是否使用主鍵、索引等等。可以查看博文: http://www.cnblogs.com/zhaoy

mysql事務——控制語句使用

spa alt ted clas 數據行 ble 事務提交 一般來說 tran 事務控制 一般來說,mysql默認開啟了事務自動提交功能,每條sql執行都會提交事務。可以使用如下語句關閉事務自動提交功能。 show session variables like ‘auto

阿裏雲服務器 ECS 部署lamp:centos+apache+mysql+php安裝配置方法 centos7

ever linux 命令 port server sel kcon linu 開機 阿裏雲服務 阿裏雲服務器 ECS 部署lamp:centos+apache+mysql+php安裝配置方法 (centos7) 1.效果圖 1 2. 部署步驟 1 1. mysql安裝附加