a. mysql只是提供了xa事务的接口,漫衍式事务中的mysql实例之间是相互独立的不感知的。 所以用户必需本身实现漫衍式事务的调治器
b. xa事务有一些利用上的bug, 参考
主要是
“MySQL数据库的主备数据库的同步,通过Binlog的复制完成。而Binlog是MySQL数据库内部XA事务的协调者,而且MySQL数据库为binlog做了优化——binlog不写prepare日志,只写commit日志。
所有的参加节点prepare完成,在举办xa commit前crash。crash recover假如选择commit此事务。由于binlog在prepare阶段未写,因此主库中看来,此漫衍式事务最终提交了,可是此事务的操纵并未 写到binlog中,因此也就未能乐成复制到备库,从而导致主备库数据纷歧致的环境呈现。
而crash recover假如选rollback, 那么就会呈现全局纷歧致(该漫衍式事务对应的节点,部门已经提交,无法回滚,而部门节点回滚。最终导致同一漫衍式事务,在各参加节点,最终状态纷歧致)”
参考的那篇blog中给出的步伐是修改mysql代码,这个无法在DBScale中利用。 所以可选的替代方案是不利用
主从复制举办备份,而是直接利用xa事务实现同步写来作为备份。
php+mysql实现漫衍式事务案例
担保数据表是innodb的
//db_finance库下
CREATE TABLE `t_user_account` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
`username` varchar(255) NOT NULL DEFAULT '' COMMENT '用户名',
`money` int(11) NOT NULL DEFAULT '0' COMMENT '账户金额',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
//db_order库下 CREATE TABLE `t_user_orders` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键', `username` varchar(255) NOT NULL DEFAULT '', `money` int(11) NOT NULL DEFAULT '0' COMMENT '订单扣款金额', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=44 DEFAULT CHARSET=utf8;
php代码
$username = '公家号PHP开源社区'; $order_money = 100; $addOrder_success = addOrder($username,$order_money); $upAccount_success = updateAccount($username,$order_money); if($addOrder_success['state'] =="yes" && $upAccount_success['state']=="yes"){ commitdb($addOrder_success['xa']); commitdb1($upAccount_success['xa']); }else{ rollbackdb($addOrder_success['xa']); rollbackdb1($upAccount_success['xa']); } die; function addOrder ($username, $order_money){ $xa = uniqid(""); $sql_xa = "XA START '$xa'"; $db = Yii::app()->dborder_readonly; $db->createCommand($sql_xa)->execute(); $insert_sql = "INSERT INTO t_user_orders (`username`,`money`) VALUES ($username,$order_money)"; $id = $db->createCommand($insert_sql)->execute(); $db->createCommand("XA END '$xa'")->execute(); if ($id) { $db->createCommand("XA PREPARE '$xa'")->execute(); return ['state' => 'yes', 'xa' => $xa]; }else { return ['state' => 'no', 'xa' => $xa]; } } function updateAccount($username, $order_money){ $xa = uniqid(""); $sql_xa = "XA START '$xa'"; $db = Yii::app()->db_finance; $db->createCommand($sql_xa)->execute(); $sql = "update t_user_account set money=money-".$order_money." where username='$username'"; $id = $db->createCommand($sql)->execute(); $db->createCommand("XA END '$xa'")->execute(); if ($id) { $db->createCommand("XA PREPARE '$xa'")->execute(); return ['state' => 'yes', 'xa' => $xa]; }else { return ['state' => 'no', 'xa' => $xa]; } } //提交事务! function commitdb($xa){ $db = Yii::app()->dborder_readonly; return $db->createCommand("XA COMMIT '$xa'")->execute(); } //回滚事务 function rollbackdb($xa){ $db = Yii::app()->dborder_readonly; return $db->createCommand("XA COMMIT '$xa'")->execute(); } //提交事务! function commitdb1($xa){ $db = Yii::app()->db_finance; return $db->createCommand("XA COMMIT '$xa'")->execute(); } //回滚事务 function rollbackdb1($xa){ $db = Yii::app()->db_finance; return $db->createCommand("XA ROLLBACK '$xa'")->execute();
到此这篇关于PHP行列场景以及实现代码实例详解的文章就先容到这了,更多相关PHP行列场景以及实现内容请搜索剧本之家以前的文章或继承欣赏下面的相关文章但愿各人今后多多支持剧本之家!
您大概感乐趣的文章: