MYSQL 分佈式事務

不少人都說php實現不了分佈式事務,java才能實現。事實其實並不是如此。php

事務和數據庫有關,和php或者java沒有關係 xa事務有2個做用:java

    1):支持分佈式事務(外部xa)mysql

    2): 保持 binlog與innodb的redo log一致性(內部xa) ,事務的實現是基於數據庫的。sql

下面看看php如何實現分佈式事務。數據庫

mysql中的innodb引擎支持xa事務。oracle

可經過如下命令查看innodb是否開啓xa事務支持,innodb默認是支持的分佈式

QQ截圖20130629155421.png

要想了解跨數據庫事務,必須先搞清楚二階段提交協議(2pc).ide

下面聊下xa支持跨數據庫的分佈式事務如何實現sqlserver

條件:多個數據庫必須都支持xa事務,mysql的innodb,oracle,sqlserver都支持xaspa

下面直接貼代碼:

$mysqlObj1 = new mysqli("10.15.51.78","root","","test")or die("$mysqlObj1 : 鏈接失敗");
$mysqlObj2 = new mysqli("10.15.51.202","root","","test")or die("$mysqlObj2 : 鏈接失敗");

$grid = uniqid("");
$mysqlObj1->query("XA START '$grid'");//準備事務1$mysqlObj2->query("XA START '$grid'");//準備事務2try {
	$return = $mysqlObj2->query("UPDATE question SET author='高海峯' WHERE id=10") ;//第一個分支事務準備作的事情,一般他們會記錄進日誌
	if($return == false) {		throw new Exception("202數據庫更新失敗!");
	}
	$return = $mysqlObj1->query("UPDATE question SET author='高海峯22' WHERE id=11");//第二個分支事務準備作的事情,一般他們會記錄進日誌
	if($return == false) {		throw new Exception("78數據庫更新失敗!");
	}
	
	$mysqlObj2->query("XA END '$grid'");
	$mysqlObj2->query("XA PREPARE '$grid'");
	
	$mysqlObj1->query("XA END '$grid'");
	$mysqlObj1->query("XA PREPARE '$grid'");//通知是否準備提交
	
	$mysqlObj1->query("XA COMMIT '$grid'");//這兩個基本同時執行
	$mysqlObj2->query("XA COMMIT '$grid'");
} catch (Exception $e) {
	$mysqlObj1->query("XA ROLLBACK '$grid'");
	$mysqlObj2->query("XA ROLLBACK '$grid'");	print $e->getMessage();
}
相關文章
相關標籤/搜索