深入理解PHP+Mysql分布式事务与解决方案
副问题[/!--empirenews.page--]
事宜(Transaction)是会见并也许更新数据库中各类数据项的一个措施执行单位; 事宜的ACID特征 事宜应该具有4个属性:原子性、同等性、断绝性、一连性 原子性(atomicity)。一个事宜是一个不行支解的事变单元,事宜中包罗的诸操纵要么都做,要么都不做。 断绝性(isolation)。一个事宜的执行不能被其他事宜滋扰。即一个事宜内部的操纵及行使的数据对并发的其他事宜是断绝的,并发执行的各个事宜之间不能相互滋扰。 漫衍式事宜:漫衍式事宜的参加者、资源打点器、事宜打点器等位于不消的节点上,这些差异的节点彼此协作配合完成一个具有逻辑完备性的事宜。 mysql从5.0开始支持XA DataSource。Connector/J 版本要行使5.0版本,5.0以下的不支持。 常见的漫衍式事宜办理方案 基于XA协议的两阶段提交 以下的函数使事宜打点器可以对资源打点器举办的操纵: XA实现漫衍式事宜的道理如下:
MySQL XA分为两类,内部XA与外部XA;内部XA用于统一实例下跨多个引擎的事宜,由各人认识的Binlog作为和谐者;外部XA用于跨多MySQL实例的分 布式事宜,必要应用层参与作为和谐者(瓦解时的悬挂事宜,全局提交照旧回滚,必要由应用层抉择,对应用层的实现要求较高); Binlog作为内部XA的和谐者,在binlog中呈现的内部xid,在crash recover时,由binlog认真提交。(这是由于,binlog不举办prepare, 只举办commit,因此在binlog中呈现的内部xid,必然可以或许担保其在底层各存储引擎中已经完成prepare)。 MySQL数据库外部XA可以用在漫衍式数据库署理层,实现对MySQL数据库的漫衍式事宜支持,譬喻开源的署理器材:网易的DDB,淘宝的TDDL,B2B的Cobar等等。 示例 public function testAction(){ $goods_id=1; $goods_name = "存眷PHP开源社区微信公家号领取PHP大厂口试题"; $num = 1; $rs_order = $this->test->createorder($goods_id,$goods_name,$num); $rs_goods = $this->test->deduction($goods_id,$num); if($rs_order['status'] =="success" && $rs_goods['status']=="success"){ $this->test->commitdb($rs_order['XA']); $this->test->commitdb1($rs_goods['XA']); }else{ $this->test->rollbackdb($rs_order['XA']); $this->test->rollbackdb1($rs_goods['XA']); } print_r($rs_order); echo "<br />"; print_r($rs_goods); die("dddd"); } public function createorder($goods_id,$goods_name,$num){ $XA = uniqid(""); $this->_db->query("XA START '$XA'"); $_rs = true; try { $data = array(); $data['order_id'] = "V".date("YmdHis"); $data['goods_name'] = $goods_name; $data['goods_num'] = $num; $this->_db->insert("temp_orders",$data); $rs = $this->_db->lastInsertId(); if($rs){ $_rs = true; }else{ $_rs = false; } } catch (Exception $e) { $_rs = false; } $this->_db->query("XA END '$XA'"); if($_rs){ $this->_db->query("XA PREPARE '$XA'"); return array("status"=>"success","XA"=>$XA); }else{ return array("status"=>"nosuccess","XA"=>$XA); } } public function deduction($id){ $XA = uniqid(""); $this->db1->query("XA START '$XA'"); $last_rs = true; try { $sql = "select * from temp_goods where id = '$id' and goods_num>0"; $rs = $this->db1->fetchRow($sql); if(!empty($rs)){ $sql = "update temp_goods set goods_num = goods_num-1 where id = '$id'"; $rd = $this->db1->query($sql); if($rd){ $last_rs = true; }else{ $last_rs = false; } }else{ $last_rs = false;; } } catch (Exception $e) { $last_rs = false;; } $this->db1->query("XA END '$XA'"); if($last_rs){ $this->db1->query("XA PREPARE '$XA'"); return array("status"=>"success","XA"=>$XA); }else{ return array("status"=>"nosuccess","XA"=>$XA); } } //提交事宜! public function commitdb($xa){ return $this->_db->query("XA COMMIT '$xa'"); } //回滚事宜 public function rollbackdb($xa){ return $this->_db->query("XA ROLLBACK '$xa'"); } //提交事宜! public function commitdb1($xa){ return $this->db1->query("XA COMMIT '$xa'"); } //回滚事宜 public function rollbackdb1($xa){ return $this->db1->query("XA ROLLBACK '$xa'"); } 总结 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |