cassandra中多表ACID事务的解决方法是啥

Posted

技术标签:

【中文标题】cassandra中多表ACID事务的解决方法是啥【英文标题】:What is the solution of multi table ACID transaction in cassandracassandra中多表ACID事务的解决方法是什么 【发布时间】:2016-08-05 00:05:48 【问题描述】:

我在关注this link to use a batch transaction without using BATCH keyword。

 Cluster cluster = Cluster.builder()
.addContactPoint(“127.0.0.1")
.build();
Session session = cluster.newSession();
//Save off the prepared statement you're going to use
PreparedStatement statement = session.prepare(“INSERT INTO tester.users (userID, firstName, lastName) VALUES (?,?,?)”);
//
List<ResultSetFuture> futures = new ArrayList<ResultSetFuture>();
for (int i = 0; i < 1000; i++) 
 //please bind with whatever actually useful data you're importing
 BoundStatement bind = statement.bind(i, “John”, “Tester”);
 ResultSetFuture resultSetFuture = session.executeAsync(bind);
 futures.add(resultSetFuture);

//not returning anything useful but makes sure everything has completed before you exit the thread.
for(ResultSetFuture future: futures)
 future.getUninterruptibly();

cluster.close();

我的问题是,对于给定的方法,是否可以插入、更新或删除 来自不同表的数据,如果其中任何一个失败,都应该通过保持相同的性能来失败(如链接)。

使用我尝试过的这种方法,我试图从不同的表中插入、删除数据,但一个查询失败了,所以之前的所有查询都被执行并更新了数据库。

使用BATCH 我可以看到,如果任何语句失败,所有语句都将失败。但是在不同的表上使用BATCH 是反模式,那么解决方案是什么?

【问题讨论】:

【参考方案1】:

使用 BATCH,我可以看到,如果任何语句失败,所有语句都将失败。

错了,LOGGED BATCH 的保证是:如果批处理中的某些语句失败,会重试直到成功。

但是在不同的表上使用 BATCH 是反模式,那么解决方案是什么?

使用 Cassandra 无法进行 ACID 事务,它需要某种全局锁定全局协调,并且在性能方面令人望而却步。

但是,如果您不关心性能成本,您可以使用 Light Weight Transaction 原语实现自己的全局锁定/租赁系统,如 here

所述

但要准备好面对糟糕的表现

【讨论】:

在 gicen 链接中只提到了 LWT,而不是关于全局锁定或全局协调

以上是关于cassandra中多表ACID事务的解决方法是啥的主要内容,如果未能解决你的问题,请参考以下文章

MySQL中多表删除方法(转载)

Django中多表查询思路

hive中多表full join主键重复问题

Hibernate-ORM:17.Hibernate中多表分页携带条件

mysql 中多表 总结

mybatis中多表联合查询与DTO的字段对应问题