首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Laravel雄辩的orm或DB facades中进行分布式事务?

如何在Laravel雄辩的orm或DB facades中进行分布式事务?
EN

Stack Overflow用户
提问于 2017-07-12 02:24:14
回答 1查看 1.2K关注 0票数 4

我在Laravel中找不到类似XA的API,而且在雄辩或DB外观中似乎没有实现。

如果我想使用XA或其他方式在Laravel中进行MySQL分布式事务,我应该如何做?

EN

回答 1

Stack Overflow用户

发布于 2019-06-18 07:09:38

如果您不需要使用分布式事务,就不要使用它。

试着考虑一下你的数据库结构的设计是否正确?

如果你还需要的话。

我认为你需要自己写;

步骤1:对于第一个数据库,您需要为它的XA事务生成唯一的id。并尝试执行sql,如果成功运行XA PREPARE your_xa_id

步骤2:对于另一个数据库,需要执行与第一步相同的操作;

步骤3:检查第一步和第二步是否成功,提交XA事务,还是全部回滚。

Somecode看起来像这样。

代码语言:javascript
复制
$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']);
}

// Insert into Database
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);
    }
}

// Update Database1
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);
   }
}

// Commit
public function commitdb($xa){
    return $this->_db->query("XA COMMIT '$xa'");
}

public function commitdb1($xa){
    return $this->db1->query("XA COMMIT '$xa'");
}

// Rollback
public function rollback($xa){
    return $this->db->query("XA ROLLBACK '$xa'");
}

public function rollbackdb1($xa){
     return $this->db1->query("XA ROLLBACK '$xa'");
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45047309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档