5

假设我们有两个数据存储:MySQL(innodb) 和 Redis。我们需要将一些数据写入两个存储并在事务中执行。

try {
  $Mysql->transaction();   //start mysql transaction
  $Mysql->somecommands();  //exec some sql
  $Redis->multi();         //start redis transaction
  $Redis->somecommands();  //exec some redis commands
  $Redis->exec()           //redis commit
  $Mysql->commit();        //mysql commit
} catch (Exception $e) {
  $Mysql->rollback();      //mysql rollback
  $Redis->discard();       //redis rollback
}

如果发生一些错误,$Mysql->commit()我们已经在 redis 中有我们的数据并且无法回滚它。最佳实践是什么?

4

1 回答 1

6

MySQL 5.0.3 及以上版本支持 XA,但 Redis 不支持,因此您无法执行传统意义上的参与者双方都理解的分布式事务PREPARECOMMIT语义ROLLBACK

在您的情况下,由于您只有 1 个不符合 XA 的参与者 (redis),因此请最后执行 redis 工作。如果redis操作成功,则提交MySQL。如果redis不成功,回滚MySQL。因此,就最佳实践而言,您走在正确的轨道上,因为您别无选择。你没有说你对redis做了多少操作,如果只有一个,你很好,但是如果你做多个redis操作MULTI/EXEC并且失败了,你需要回滚MySQL撤消redis操作这是成功的,因为MULTI/EXEC它不是原子的。

于 2013-05-08T14:29:04.040 回答