Heim > Artikel > Backend-Entwicklung > Verteilte PHP-MySQL-Transaktion (XA)
Transaktion ist eine Programmausführungseinheit, die auf verschiedene Datenelemente in der Datenbank zugreift und diese aktualisieren kann
Transaktionen sollten 4 Attribute haben: Atomizität, Konsistenz, Isolation und Persistenz
Atomizität. Eine Transaktion ist eine unteilbare Arbeitseinheit. Alle in der Transaktion enthaltenen Vorgänge werden entweder ausgeführt oder keine davon.
Konsistenz. Eine Transaktion muss die Datenbank von einem Konsistenzzustand in einen anderen ändern. Konsistenz und Atomizität hängen eng zusammen.
Isolation. Die Ausführung einer Transaktion kann nicht durch andere Transaktionen beeinträchtigt werden. Das heißt, die innerhalb einer Transaktion verwendeten Vorgänge und Daten sind von anderen gleichzeitigen Transaktionen isoliert und gleichzeitig ausgeführte Transaktionen können sich nicht gegenseitig stören.
Haltbarkeit. Kontinuität, auch Permanenz genannt, bedeutet, dass die Änderungen an den Daten in der Datenbank dauerhaft sein sollten, sobald eine Transaktion festgeschrieben wurde. Nachfolgende Operationen oder Ausfälle sollten keine Auswirkungen darauf haben.
Verteilte Transaktion: Teilnehmer, Ressourcenmanager, Transaktionsmanager usw. verteilter Transaktionen befinden sich auf verschiedenen Knoten. Diese verschiedenen Knoten kooperieren miteinander, um eine Transaktion mit logischer Integrität abzuschließen.
Korrigieren Sie ein Missverständnis über MySQL. MySQL unterstützt XA DataSource ab 5.0. Die Connector/J-Version muss Version 5.0 verwenden, und Versionen unter 5.0 werden nicht unterstützt.
Das XA-Protokoll wurde zuerst von Tuxedo vorgeschlagen und als Schnittstellenstandard für Ressourcenmanager (Datenbanken) und Transaktionsmanager an die X/Open-Organisation übergeben. Derzeit bieten große Datenbankhersteller wie Oracle, Informix, DB2 und Sybase Unterstützung für XA. Das XA-Protokoll verwendet eine zweiphasige Commit-Methode zur Verwaltung verteilter Transaktionen. Die XA-Schnittstelle bietet eine Standardschnittstelle für die Kommunikation zwischen Ressourcenmanagern und Transaktionsmanagern. Das XA-Protokoll umfasst zwei Funktionssätze, die mit xa_ beginnen und die mit ax_ beginnen.
Die folgenden Funktionen ermöglichen es dem Transaktionsmanager, Operationen auf dem Ressourcenmanager auszuführen:
1) xa_open, xa_close: Herstellen und Schließen der Verbindung mit dem Ressourcenmanager.
2) xa_start,xa_end: Starten und beenden Sie eine lokale Transaktion.
3) xa_prepare,xa_commit,xa_rollback: Eine lokale Transaktion vorab festschreiben, festschreiben und zurücksetzen.
4) xa_recover: Rollback einer vorab festgeschriebenen Transaktion.
5) Die mit ax_ beginnenden Funktionen ermöglichen es dem Ressourcenmanager, sich dynamisch im Transaktionsmanager zu registrieren und auf XID (TRANSAKTIONS-IDS) zu arbeiten.
6) ax_reg, ax_unreg; ermöglicht einem Ressourcenmanager die dynamische Registrierung oder Abmeldung in einem TMS (TRANSACTION MANAGER SERVER).
MySQL-XA ist in zwei Kategorien unterteilt: internes XA und externes Verteilte Transaktionen erfordern, dass die Anwendungsschicht als Koordinator eingreift (angehaltene Transaktionen während eines Absturzes, eines globalen Commits oder eines Rollbacks müssen von der Anwendungsschicht entschieden werden, was höhere Implementierungsanforderungen für die Anwendungsschicht erfordert);
Binlog Als interner XA-Koordinator wird die interne XID, die im Binlog angezeigt wird, vom Binlog während der Wiederherstellung nach einem Absturz übermittelt. (Dies liegt daran, dass das Binlog nicht vorbereitet, sondern nur festschreibt. Daher muss garantiert werden, dass die interne XID, die im Binlog angezeigt wird, in den zugrunde liegenden Speicher-Engines vorbereitet wurde.)
Das externe XA der MySQL-Datenbank kann in der verteilten Datenbank-Proxy-Schicht verwendet werden, um verteilte Transaktionsunterstützung für die MySQL-Datenbank zu implementieren, z. B. Open-Source-Proxy-Tools: DDB von NetEase, TDDL von Taobao, Cobar von B2B usw.
Beispiel
public function testAction(){ $goods_id=1; $goods_name = "大西瓜"; $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'"); }