2015-05-12 9 views
1

У облегченных транзакций Cassandra используется подразумеваемый SET, и поэтому он не может иметь IF-часть с точки зрения первичного ключа?Can Cassandra LWT имеют часть IF с точки зрения ОСНОВНОГО КЛЮЧА

Я спрашиваю, потому что драйвер Java Datastax Cassandra (версия 2.1.5) бросает InvalidQueryException, пока я готовлю инструкцию. Сообщение об исключении достаточно ясно:

PRIMARY KEY часть имени находится в SET части

Кроме того, что запрос он готовится делает не попытки установить первичный ключ. Запрос

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

Как вы можете видеть, запрос делает SET password и не устанавливает name; name является основной ключ к таблице operator. Сообщение об исключении будет иметь смысл только в том случае, если IF name = :name облегченной транзакции был реализован с использованием SET name = ....

Если я удалю часть IF name = :name из запроса, водитель не жалуется на попытку установить ключ primry.

Вот полный StackTrace:

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

ответ

4

Вы не можете установить условие на колонке ключевого раздела (IF name = 'foo'), потому что столбец уже ограничен в пункте где (WHERE name = 'foo').

Существует действительно проблема с сообщением об ошибке. Это, по-видимому, было исправлено, с Cassandra 2.1.4 я получаю: PRIMARY KEY column 'name' cannot have IF conditions.

+0

[CASSANDRA-7804] (https://issues.apache.org/jira/browse/CASSANDRA-7804), исправленный в 2.0.11 и 2.1.1. –

 Смежные вопросы

  • Нет связанных вопросов^_^