我们正在尝试跨多个Redis数据库设计分布式事务。是否可以使用Lua Script来实现这一目标?我们不希望通过2阶段提交来实现,因为这可能导致数据丢失。我们承担不起数据丢失的费用。
示例场景:我有3个Redis数据库。我们需要更新所有3.更新可以是顺序的,但我们希望只有在所有三个都成功的情况下才能成功结束事务。如果其中任何一个失败,我们应该能够回滚所有这些。
答案 0 :(得分:0)
不,仅依靠Lua脚本在Redis实例之间实现分布式事务是不可能的,因为Redis不公开用于网络调用的库。但是,您可以使用Lua脚本作为构建分布式事务的解决方案的一部分(我使用Lua脚本在Redis服务器上实现Paxos)。
顺便说一句,在你的问题中,对于导致数据丢失的2阶段提交存在误解。它不可能发生。 2PC的教科书实施可能会导致系统被阻止但不会导致数据丢失的情况。但即使阻止也不是问题,因为有2PC的非阻止版本,就像谷歌的Percolator论文中那样。我创建了a visualization of non-blocking 2PC。它可以帮助你理解它的运动部件。