【问题标题】:Can Cassandra LWTs have an IF part in terms of a PRIMARY KEYCassandra LWT 能否在 PRIMARY KEY 方面具有 IF 部分
【发布时间】:2015-05-12 09:01:39
【问题描述】:

Cassandra 轻量级事务是否使用隐含的 SET,因此就主键而言不能有 IF 部分?

我之所以问,是因为 Datastax Cassandra Java 驱动程序(2.1.5 版)在我准备声明时抛出了 InvalidQueryException。异常信息很清楚:

在 SET 部分中找到 PRIMARY KEY 部分名称

除了它正在准备的查询没有尝试设置主键。查询是

 UPDATE operator SET password = :password WHERE name = :name IF name = :name;

如您所见,查询设置password,并没有设置name; name 是 operator 表的主键。仅当轻量级事务的IF name = :name 使用SET name = ... 实现时,异常消息才有意义。

如果我从查询中删除 IF name = :name 部分,驱动程序不会抱怨尝试设置主键。

这是完整的堆栈跟踪:

org.springframework.dao.InvalidDataAccessResourceUsageException:在 SET 部分中找到 PRIMARY KEY 部分名称;嵌套异常是 com.datastax.driver.core.exceptions.InvalidQueryException: PRIMARY KEY part name found in SET part 在 com.example.application.datalayer.DriverExceptionTranslator.translateExceptionIfPossible(DriverExceptionTranslator.java:200) ~[application-user.jar:1.0.0-SNAPSHOT] 在 com.example.application.datalayer.DriverExceptionTranslator$ExceptionTranslationAdvice.afterThrowing(DriverExceptionTranslator.java:50) ~[application-user.jar:1.0.0-SNAPSHOT] 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.7.0_75] 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[na:1.7.0_75] 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.7.0_75] 在 java.lang.reflect.Method.invoke(Method.java:606) ~[na:1.7.0_75] 在 org.springframework.aop.framework.adapter.ThrowsAdviceInterceptor.invokeHandlerMethod(ThrowsAdviceInterceptor.java:145) ~[application-user.jar:1.0.0-SNAPSHOT] 在 org.springframework.aop.framework.adapter.ThrowsAdviceInterceptor.invoke(ThrowsAdviceInterceptor.java:130) ~[application-user.jar:1.0.0-SNAPSHOT] 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[application-user.jar:1.0.0-SNAPSHOT] 在 org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) ~[application-user.jar:1.0.0-SNAPSHOT] 在 com.example.application.user.$Proxy0.addUser(Unknown Source) ~[na:1.0.0-SNAPSHOT] 在 com.example.application.user.Add.tryToAddUser(Add.java:294) [application-user.jar:1.0.0-SNAPSHOT] 在 com.example.application.user.Add.performOperation(Add.java:266) [application-user.jar:1.0.0-SNAPSHOT] 在 com.example.application.user.Mode.run(Mode.java:812) [application-user.jar:1.0.0-SNAPSHOT] 在 com.example.application.user.Mode.runProgram(Mode.java:79) [application-user.jar:1.0.0-SNAPSHOT] 在 com.example.application.user.Add.main(Add.java:63) [application-user.jar:1.0.0-SNAPSHOT] 原因:com.datastax.driver.core.exceptions.InvalidQueryException:在 SET 部分中找到 PRIMARY KEY 部分名称 在 com.datastax.driver.core.exceptions.InvalidQueryException.copy(InvalidQueryException.java:35) ~[application-user.jar:1.0.0-SNAPSHOT] 在 com.datastax.driver.core.DefaultResultSetFuture.extractCauseFromExecutionException(DefaultResultSetFuture.java:289)~[application-user.jar:1.0.0-SNAPSHOT] 在 com.datastax.driver.core.AbstractSession.prepare(AbstractSession.java:79) ~[application-user.jar:1.0.0-SNAPSHOT] 在 com.example.application.user.CassandraUserRepository$SessionAdapter.(CassandraUserRepository.java:80) ~[application-user.jar:1.0.0-SNAPSHOT] 在 com.example.application.user.CassandraUserRepository.getSessionAdapter(CassandraUserRepository.java:447) ~[application-user.jar:1.0.0-SNAPSHOT] 在 com.example.application.user.CassandraUserRepository.addUser(CassandraUserRepository.java:317) ~[application-user.jar:1.0.0-SNAPSHOT] 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.7.0_75] 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[na:1.7.0_75] 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.7.0_75] 在 java.lang.reflect.Method.invoke(Method.java:606) ~[na:1.7.0_75] 在 org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317) ~[application-user.jar:1.0.0-SNAPSHOT] 在 org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) ~[application-user.jar:1.0.0-SNAPSHOT] 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) ~[application-user.jar:1.0.0-SNAPSHOT] 在 org.springframework.aop.framework.adapter.ThrowsAdviceInterceptor.invoke(ThrowsAdviceInterceptor.java:125) ~[application-user.jar:1.0.0-SNAPSHOT] ...省略了8个常用框架 原因:com.datastax.driver.core.exceptions.InvalidQueryException:在 SET 部分中找到 PRIMARY KEY 部分名称 在 com.datastax.driver.core.Responses$Error.asException(Responses.java:103) ~[application-user.jar:1.0.0-SNAPSHOT] 在 com.datastax.driver.core.SessionManager$1.apply(SessionManager.java:185) ~[application-user.jar:1.0.0-SNAPSHOT] 在 com.datastax.driver.core.SessionManager$1.apply(SessionManager.java:160) ~[application-user.jar:1.0.0-SNAPSHOT] 在 com.google.common.util.concurrent.Futures$1.apply(Futures.java:720) ~[application-user.jar:1.0.0-SNAPSHOT] 在 com.google.common.util.concurrent.Futures$ChainingListenableFuture.run(Futures.java:859) ~[application-user.jar:1.0.0-SNAPSHOT] 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) ~[na:1.7.0_75] 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) ~[na:1.7.0_75] 在 java.lang.Thread.run(Thread.java:745) ~[na:1.7.0_75]

【问题讨论】:

    标签: java transactions cassandra datastax-java-driver


    【解决方案1】:

    您不能对分区键列 (IF name = 'foo') 设置条件,因为该列已在 where 子句 (WHERE name = 'foo') 中受到限制。

    错误信息确实有问题。这显然已得到修复,我在 Cassandra 2.1.4 中得到:PRIMARY KEY column 'name' cannot have IF conditions。

    【讨论】:

    猜你喜欢
    • 2013-10-02
    • 1970-01-01
    • 2015-01-30
    • 2015-01-20
    • 1970-01-01
    • 2016-02-06
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    相关资源
    最近更新 更多