gpt4 book ai didi

php - 如何在 Laravel Eloquent orm 或 DB facades 中进行分布式事务?

转载 作者:可可西里 更新时间:2023-11-01 09:00:27 27 4
gpt4 key购买 nike

我在 Laravel 中找不到像 XA 这样的 API,并且在 Eloquent 或 DB facades 中似乎没有实现。

如果我想在Laravel中使用XA或者其他方式做一个MySQL分布式事务,应该怎么办?

最佳答案

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

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

如果你还需要它。

我觉得你需要自己写;

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

第二步:对于另一个数据库,需要做与第一步相同的事情;

第三步:检查第一步和第二步是否成功,提交XA事务,或者全部回滚。

一些代码看起来像这样。

$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'");
}

关于php - 如何在 Laravel Eloquent orm 或 DB facades 中进行分布式事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45047309/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com