diff --git a/publish/dtm.php b/publish/dtm.php index 2c37ff7..2d6259b 100644 --- a/publish/dtm.php +++ b/publish/dtm.php @@ -19,6 +19,7 @@ 'barrier' => [ 'db' => [ 'type' => DbType::MySQL, + // 'type' => DbType::DB, ], 'apply' => [], ], diff --git a/src/Barrier.php b/src/Barrier.php index aea87e4..cc906bc 100644 --- a/src/Barrier.php +++ b/src/Barrier.php @@ -21,10 +21,13 @@ class Barrier protected MySqlBarrier $mySqlBarrier; - public function __construct(ConfigInterface $config, MySqlBarrier $mySqlBarrier) + protected DbBarrier $dbBarrier; + + public function __construct(ConfigInterface $config, MySqlBarrier $mySqlBarrier, DbBarrier $dbBarrier) { $this->config = $config; $this->mySqlBarrier = $mySqlBarrier; + $this->dbBarrier = $dbBarrier; } public function call(callable $businessCall) @@ -77,6 +80,8 @@ protected function getBarrier(): BarrierInterface switch ($this->config->get('dtm.barrier.db.type', DbType::MySQL)) { case DbType::MySQL: return $this->mySqlBarrier; + case DbType::DB: + return $this->dbBarrier; default: throw new UnsupportedException('Barrier DB type is unsupported.'); } diff --git a/src/Constants/DbType.php b/src/Constants/DbType.php index 8fabd53..780e42d 100644 --- a/src/Constants/DbType.php +++ b/src/Constants/DbType.php @@ -12,5 +12,7 @@ class DbType { public const MySQL = 'mysql'; + public const DB = 'db'; + public const Redis = 'redis'; } diff --git a/src/DbBarrier.php b/src/DbBarrier.php new file mode 100644 index 0000000..29038a1 --- /dev/null +++ b/src/DbBarrier.php @@ -0,0 +1,61 @@ +DBTransaction->connection(); + $table = $db->raw('barrier'); + $db->table($table)->insertOrIgnore([ + 'trans_type' => $transType, + 'gid' => $gid, + 'branch_id' => Branch::MsgDoBranch0, + 'op' => Branch::MsgDoOp, + 'barrier_id' => Branch::MsgDoBarrier1, + 'reason' => Operation::ROLLBACK, + ]); + + $reason = $db->table($table) + ->select('reason') + ->where([ + 'gid' => $gid, + 'branch_id' => Branch::MsgDoBranch0, + 'op' => Branch::MsgDoOp, + 'barrier_id' => Branch::MsgDoBarrier1, + ])->first(); + + if ($reason->reason == Operation::ROLLBACK) { + throw new FailureException(); + } + return true; + } + + protected function insertBarrier(string $transType, string $gid, string $branchId, string $op, string $barrierID, string $reason): int + { + if (empty($op)) { + return 0; + } + $db = $this->DBTransaction->connection(); + $table = $db->raw('barrier'); + return $db->table($table)->insertOrIgnore([ + 'trans_type' => $transType, + 'gid' => $gid, + 'branch_id' => $branchId, + 'op' => $op, + 'barrier_id' => $barrierID, + 'reason' => $reason, + ]); + } +} diff --git a/src/DbTransaction/DBTransactionInterface.php b/src/DbTransaction/DBTransactionInterface.php index 8915b84..2222ab2 100644 --- a/src/DbTransaction/DBTransactionInterface.php +++ b/src/DbTransaction/DBTransactionInterface.php @@ -22,6 +22,11 @@ public function execute(string $sql, array $bindings = []): int; public function query(string $sql, array $bindings = []): bool|array; + /** + * @return \Hyperf\Database\ConnectionInterface|\Illuminate\Database\ConnectionInterface + */ + public function connection(); + public function xaExecute(string $sql, array $bindings = []): int; public function xaQuery(string $sql, array $bindings = []): bool|array; diff --git a/src/DbTransaction/HyperfDbTransaction.php b/src/DbTransaction/HyperfDbTransaction.php index efbc1cb..d99a64b 100644 --- a/src/DbTransaction/HyperfDbTransaction.php +++ b/src/DbTransaction/HyperfDbTransaction.php @@ -42,4 +42,9 @@ public function query(string $sql, array $bindings = []): bool|array { return Db::select($sql, $bindings); } + + public function connection() + { + return Db::connection(); + } } diff --git a/src/DbTransaction/HyperfSimpleDbTransaction.php b/src/DbTransaction/HyperfSimpleDbTransaction.php index 9dd8ea7..ab47f8a 100644 --- a/src/DbTransaction/HyperfSimpleDbTransaction.php +++ b/src/DbTransaction/HyperfSimpleDbTransaction.php @@ -8,6 +8,7 @@ */ namespace DtmClient\DbTransaction; +use Exception; use Hyperf\Contract\ConfigInterface; use Hyperf\DB\DB; @@ -42,5 +43,9 @@ public function query(string $sql, array $bindings = []): bool|array { return DB::query($sql, $bindings); } - + + public function connection() + { + throw new Exception('Not implemented'); + } } diff --git a/src/DbTransaction/LaravelDbTransaction.php b/src/DbTransaction/LaravelDbTransaction.php index b98a480..3838fab 100644 --- a/src/DbTransaction/LaravelDbTransaction.php +++ b/src/DbTransaction/LaravelDbTransaction.php @@ -1,11 +1,7 @@