目錄介紹
- MessageTr.php 消息事物類
- Business.php 主業務類
- BusinessDb.php DB事物類
MessageTr.php
<?php
/*** 消息事物類
* Class MessageTr
*/
class MessageTr
{
/**
* 消息標籤
*/
const MT_TAG_SEND = 1 ; #未發送
const MT_TAG_SURE = 2 ; #確認發送
const MT_TAG_OK = 3 ; #發送成功
const MT_TAG_CANCEL = 0 ; #已取消
/** 請求發送消息
* @param array ...$params
* @return int
*/
public function mtSend(...$params)
{
//根據 $params 進行處理
//只記錄消息數據不發送消息,標記消息爲1
//返回消息惟一標識
return rand(1,10000);
}
/** 確認發送消息
* @param $uniqueId
*/
public function mtSure($uniqueId)
{
//根據 $uniqueId 對消息進行處理
//發送消息數據,標記消息爲2
//消息發送成功後,標記消息爲3
}
/** 取消發送消息
* @param $uniqueId
*/
public function mtCancel($uniqueId)
{
//根據 $uniqueId 對消息進行處理
//標記消息爲0
}
/**
* 按期確認 tag 爲 0 和 1 的數據
*/
public function mtJob()
{
//請求消息來源方,確認爲廢消息後移除數據
}
/**
* 消息補償,最終一致性
*/
public function mtRecoup()
{
//獲取消息 tag 爲 2 的數據,保持數據一致性
}
}
Business.php
<?php
/** 主業務類
* Class Business
*/
class Business
{
/** 消息事物類
* @var MessageTr
*/
private $messageTr ;
public function init()
{
//初始化
$this->messageTr = new MessageTr();
}
/**
* 業務處理
*/
public function deal()
{
//初始化
$this->init();
/** 發送消息事物請求
* @var $uniqueId string 消息事物返回的惟一標識
*/
$uniqueId = $this->messageTr->mtSend();
//記錄本地消息
$this->message();
//事物
$tr = new BusinessDb();
$tr->trBegin();
//TCC事物模型 try-commit-cancel
try{
//業務處理 do something
//事物提交
$tr->trCommit();
//確認發送消息事物
$this->messageTr->mtSure($uniqueId);
//改變本地消息
$this->message();
}catch (Exception $exception){
//事物回滾
$tr->trRollback();
//回滾消息事物
$this->messageTr->mtCancel($uniqueId);
//改變本地消息
$this->message();
}
}
public function message()
{
//記錄消息的發送,確認發送,回滾
}
}
BusinessDb.php
<?php
/** 主業務DB
* Class BusinessDb
*/
class BusinessDb
{
public function trBegin()
{
//開啓事物
}
public function trCommit()
{
//提交事物
}
public function trRollback()
{
//事物回滾
}
}
圖解
