Laravel 分布式事务处理
TCC是现在非常流行分布式处理模式,属于柔性事务。柔性事务,基于分布式领域BASE理论,它是在CAP理论(一致性、可用性、分区容忍性)的基础之上的延伸,包括:基本可用(Basically Available)、柔性状态(Soft State)、最终一致性(Eventual Consistency)。
* 基本可用:分布式系统出现故障的时候,允许损失一部分可用性。
* 柔性状态:允许系统存在中间状态,这个中间状态又不会影响系统整体可用性。
* 最终一致性:数据经过重试等机制处理后,最终数据能达到一致。
处理方式
两阶段提
交事务补偿型
最大努力型
laravel 分布式事务处理 - 2PC 两阶段
事务管理器:
/**
* 分布式事务处理
* @param $xids
*/
public function XAProcess($xids)
{
try {
$status = array();
foreach ($xids as $xid) {
$status[$xid] = false;
$translog = TransLog::where('xid',$xid)->get();
try {
foreach ($translog as $item) {
$this->pdo->$xid->query($item->sql);
Log::info("Transaction SQL:".json_encode($item->sql));
}
$status[$xid] = true;
} catch (\Exception $e) {
$status[$xid] = false;
}
}
if (!in_array(false,array_values($status))) {
$this->Commit($xids);
Log::info('transaction committed');
} else {
$this->Rollback($xids);
Log::info('transaction rollback');
}
} catch (\Exception $e) {
$this->Rollback($xids);
Log::info('transaction rollback:'.$e->getMessage());
}
}
/**
* 事务提交
* @param $xids
*/
public function Commit($xids)
{
$this->XAEnd($xids);
$this->XAPrepare($xids);
$this->XACommit($xids);
}
/**
* 事务回滚
* @param $xids
*/
public function RollBack($xids)
{
$this->XAEnd($xids);
$this->XAPrepare($xids);
$this->XARollback($xids);
}
/**
* 事务开始
* @param $xids
*/
public function XAStart($xids)
{
foreach ($xids as $xid) {
$this->pdo->$xid = $this->getPdo('mysql');
$this->pdo->$xid->exec("XA START '$xid'");
}
}
/**
* 事务结束
* @param $xids
*/
public function XAEnd($xids)
{
foreach ($xids as $xid) {
$this->pdo->$xid->exec("XA END '$xid'");
}
}
/**
* 事务预处理
* @param $xids
*/
public function XAPrepare($xids)
{
foreach ($xids as $xid) {
$this->pdo->$xid->exec("XA PREPARE '$xid'");
}
}
/**
* 事务提交
* @param $xids
*/
public function XACommit($xids)
{
foreach ($xids as $xid) {
$this->pdo->$xid->exec("XA COMMIT '$xid'");
}
}
/**
* 事务回滚
* @param $xids
*/
public function XARollback($xids)
{
foreach ($xids as $xid) {
$this->pdo->$xid->exec("XA ROLLBACK '$xid'");
}
}
/**
* 执行sql
* @param $sql
*/
public function XAQuery($sql)
{
$this->pdo->query($sql);
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 6年前 自动加精
高阶操作,可以的
不明觉厉:+1:
XAPrepare 和XAStart 方法貌似没有调用呢
都是伪代码,这样还不如不用代码