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事务的解决方法是啥的主要内容,如果未能解决你的问题,请参考以下文章