php使用xa規范實現分布式事務處理


具體實例如下,對數據表進行插入和刪除操作,兩個操作都成功才會修改數據表,否則數據表不變。

<?php
class connDb{
    private static $host = 'jxq-off-ku-qa00.dns.ganji.com:3400';
    private static $username = 'root';
    private static $password = '123456';
    private static $dbName = 'test';
    private $conn = null;

    public function __construct(){
        $this->conn = new MySQLi(self::$host,self::$username,self::$password,self::$dbName);
        if(!$this->conn){
            die('數據庫連接錯誤:'.$this->conn->connect_error);
        }
        $this->conn->query("set names utf-8");
    }

    public function execute_xa($sql){
        $this->conn->query($sql);
    }

    public function execute_dql($sql){
        $rs = $this->conn->query($sql) or die('查詢數據庫出錯:'.$this->conn->error);
        $rsList = array();
        if($rs){
            while($row = $rs->fetch_assoc()){
                $rsList[] = $row;
            }
        }
        $rs->free();
        return $rsList;
    }

    public function execute_dml($sql){
        $rs = $this->conn->query($sql);
        if(!$rs){
            $flag = 0;
            die('數據庫操作出錯:'.$this->conn->error);
        }else if($this->conn->affected_rows > 0){
            $flag = 1;
        }else{
            $flag = 2;
        }
        return $flag;
    }

    public function closeConn(){
        $this->conn->close();
    }
}

testAction();
function testAction(){
    $XA = uniqid("");
    $conn1 = new connDb();
    $conn2 = new connDb();
    $sql1 = "insert into LiuHuaYongUser (username,password) values('admin3','111111')";
    $sql2 = "delete from LiuHuaYongUser where id = 165";
    $conn1->execute_xa("XA START '$XA'");
    $conn2->execute_xa("XA START '$XA'");
    try{
        $add_status = $conn1->execute_dml($sql1);
        $del_status = $conn1->execute_dml($sql2);

        $conn1->execute_xa("XA END '$XA'");
        $conn2->execute_xa("XA END '$XA'");

        $conn1->execute_xa("XA PREPARE '$XA'");
        $conn2->execute_xa("XA PREPARE '$XA'");

        if(!($add_status && $del_status)){
            throw new Exception("操作失敗");
        }

        echo '程序運行成功!';
        $conn1->execute_xa("XA COMMIT '$XA'");
        $conn2->execute_xa("XA COMMIT '$XA'");
    }catch (Exception $ex){
        echo '程序運行失敗!';
        $conn1->execute_xa("XA ROLLBACK '$XA'");
        $conn2->execute_xa("XA ROLLBACK '$XA'");
    }


}



?>

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM