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 数据库在同一个服务器那么久没有什么影响,但是如果分布在不同的局域网,那么可能经常因为网络延迟导致事务失败。

上面例子中其实是启动的一个事务








  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值