单机单数据源事务
首先从单机事务开始。
大概逻辑如下 :
try { // 开始事务 $db->beginTransaction(); // 实行你的操作 // ... // 提交事务 $db->commit();} catch (Exception $e) { // 实行失落败 回滚 $db->rollBack();}
单机多个数据源事务
如果你业务涉及到多个数据库,事务大概逻辑是这个样子:
try { // 开始事务 $db1->beginTransaction(); $db2->beginTransaction(); // 实行你的操作 // ... // 提交事务 $db1->commit(); $db2->commit();} catch (Exception $e) { // 实行失落败 回滚 $db1->rollBack(); $db2->rollBack();}
多机多数据源事务(分布式事务)
如果你的数据源和业务代码都是分开的(微做事)这便是我们本日的核心。
由前面两种情形来看,大概逻辑是差不多的,紧张也分为 4 个步骤。
开始事务实行逻辑代码提交事务回滚事务有些文章也称为 tcc 也便是 234 步骤。
我们用一个常用的例子:下单。
紧张 3 个步骤:
创建订单修正库存修正用户积分假设订单,库存,用户都是独立的做事。
按照前面的履历大概分为 4 个步骤,我们以用户为例代码如下:
库存 (stock),订单 (order) 和上面类似,也须要这 4 个方法,我就不写了。
难点在于我们没法直接操作数据源,只能通过 rpc 调用相应的做事来操作。依次实行上面的方法就好了。代码如下:
try { // 开始事务 $user = new User(); $stock = new Stock(); $order = new Order(); $user = $user->beginTransaction(); $stock = $stock->beginTransaction(); $order = $order->beginTransaction(); // 实行你的操作 $user = $user->doTransaction(); $stock = $stock->doTransaction(); $order = $order->doTransaction(); // 提交事务 $user->commit(); $stock->commit(); $order->commit();} catch (Exception $e) { // 实行失落败 回滚 $user->rollBack(); $stock->rollBack(); $order->rollBack();}
到这里可能有人看出问题来了,正常情形下这样肯定是弗成的。要上面这段代码成立须要知足 1 个条件:User 分别调用了 3 次,也便是 3 个要求。要担保这 3 个要求是调用的同一个实例化后的工具。Stock 和 Order 一样。
User 调用逻辑如下:
// 第一次要求调用$user = new User();$user = $user->beginTransaction();// 第二次要求调用 复用的第一次 $user$user = $user->doTransaction();// 第三次要求调用 复用的第一次 $user$user->commit();//或者 $user->rollBack();
one 框架 https://github.com/lizhichao/one
极简。高性能。松耦合。分布式。可运行于多种环境
one 框架完美支持上面的哀求。只须要把上面的 User、Stock 和 Order 添加为 rpc 做事即可。还须要把稳 beginTransaction 和 doTransaction 方法必须返回 $this 供应给后面的方法调用。
user 做事如下:
RpcServer::add(User::class);
其他两个类似。到此分布式事务问题就搞定了,可能以为这么大略吗?这紧张由于 one框架的 rpc 做事供应了链式调用(多个要求复用同一个工具)的功能。
可能有人要问:如果由于网络问题或者其他问题导致末了一个做事的末了一次调用失落败了怎么办?
办理方案便是事务补偿,你可以把这类极度的情形下的缺点,放到一个行列步队里 起一做事来专门处理这里问题。