我有一个Web应用程序,它接收在数据库中保存订单的请求。我想写两个不同的数据库 - 一个Cassandra实例和一个PostgreSQL实例。我正在使用普通的Java和JDBC(带有apache DBUtis),前面有一个轻量级的Web应用程序库。
我不确定如何跨两个数据库实现事务性,即如果对其中一个数据库的写入失败,则回滚另一个写入并在错误日志中放入错误消息。
Java中是否有任何机制来实现这一点?我知道两阶段提交这样的事情,我会在这里找到什么?还有其他选择吗?
答案 0 :(得分:2)
Cassandra& PostgreSQL支持线性化和比较和设置(CAS),因此您可以在客户端实现事务。
如果您想要Serializable Isolation级别,那么您应该查看Percolator's transactions。 Percolator的交易在业界广为人知,并已在亚马逊DynamoDB transaction library,CockroachDB database和谷歌的Pecolator系统中使用。 Percolator的step-by-step visualization交易可以帮助您理解它。
如果您期望争用并且可以处理Read Committed隔离级别,那么Peter Bailis的RAMP transactions可能适合您。我还创建了一个step-by-step RAMP visualization。
第三种方法是使用补偿交易,也称为传奇模式。它在80年代晚期的Sagas论文中有所描述,但随着分布式系统的发展变得越来越实际。请参阅Applying the Saga Pattern对话获取灵感。