Cassandra表中的分布式行级锁定或实现更高的一致性

Cassandra表中的分布式行级锁定或实现更高的一致性,cassandra,datastax,Cassandra,Datastax,我们正在微服务项目中使用Cassandra DB。在生产环境中,此服务部署在PCF中,可扩展到6个实例。我们有一个表(TableA),其中一列(materialSet)为冻结集。在其中一个功能中,并行线程正在执行以下功能(方法已同步)– 阅读表A以获取材料集 向materialSet添加/删除来自请求的材料 将最终材料集写入表A 在较低的服务环境中使用单实例,工作良好。但在生产中,当服务扩展到多个实例时,表中的结果变得不一致。原因是synchronized将在同一JVM中工作,但当服务被扩展时,

我们正在微服务项目中使用Cassandra DB。在生产环境中,此服务部署在PCF中,可扩展到6个实例。我们有一个表(TableA),其中一列(materialSet)为冻结集。在其中一个功能中,并行线程正在执行以下功能(方法已同步)–

  • 阅读表A以获取材料集
  • 向materialSet添加/删除来自请求的材料
  • 将最终材料集写入表A
  • 在较低的服务环境中使用单实例,工作良好。但在生产中,当服务扩展到多个实例时,表中的结果变得不一致。原因是synchronized将在同一JVM中工作,但当服务被扩展时,其他实例将在不同的JVM中运行,并且读/写操作是独立进行的。有没有办法解决这个问题?我知道我们所遵循的可能是糟糕的数据模型,这导致了我们在这个问题上的失败,但我们无法改变这一点


    有没有办法在Cassandra表中使用分布式行级锁定,或者有没有办法实现更高的一致性?

    请查看Patrick Callaghan的示例,该示例使用LWT在库存管理场景中强制实现跨线程+跨进程序列化:

    具体而言,您可能对使用IF关键字的查询感兴趣:

    UPDATE " + tableNameProduct + " SET orderIds=orderIds + {'" + order.getOrderId() + "'},"
                + " capacityleft = " + (lastCapacity-1) + " WHERE productId = '" + order.getProductId() + "' IF capacityleft = " + lastCapacity;