不少人都說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默認是支持的分佈式
要想了解跨數據庫事務,必須先搞清楚二階段提交協議(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(); }