java cassandra cql3

Cassandra Java Driver: ¿Cómo se informan los resultados de inserción, actualización y eliminación?



cql3 (4)

Estoy escribiendo una aplicación y necesito poder decir si las inserciones y actualizaciones tienen éxito. Estoy usando "INSERTAR ... SI NO EXISTE" para obtener el comportamiento de transacción ligero y noté que el conjunto de resultados devuelto por execute contiene una fila con datos actualizados y una columna "[aplicada]" que puede consultarse. Eso es genial Pero tengo una declaración de actualización que devuelve un ResultSet vacío. Parece que la actualización está teniendo éxito, pero quiero una forma programática para verificar eso.

Para aclarar:

He activado algunos registros de los conjuntos de resultados devueltos por mis mutaciones. He encontrado que "INSERTAR ... SI NO EXISTE" devuelve un ResultSet con una columna booleana llamada "[aplicado]". Si "[applied]" es falso, también devuelve la fila que ya sale.

Con UPDATE, siempre veo un ResultSet vacío.

Entonces tengo dos preguntas:

  1. ¿Dónde está la documentación sobre qué debe contener el ResultSet para cada tipo de mutación? No lo vi en los documentos de CQL ni en los documentos de Java Driver. Incluso intenté mirar los documentos de integraciones de otros idiomas y no encontré ninguna descripción del contenido de ResultSet para las mutaciones.
  2. ¿Hay alguna manera de averiguar cuántas filas fueron modificadas por una ACTUALIZACIÓN o eliminadas por un BORRAR?

En Cassandra insert / update / delete se comportan igual y se llaman mutaciones. Si su cliente no devuelve ninguna excepción, entonces la mutación está hecha.

Si le preocupa la coherencia de sus llamadas de mutación, agregue USING CONSISTENCY con niveles más altos.

http://www.datastax.com/docs/1.0/references/cql/index http://www.datastax.com/docs/1.1/dml/data_consistency

Si buscas buena consistencia, te recomiendo usar LOCAL_QUORUM tanto para lecturas como para mutaciones. De esta forma, no tiene que preocuparse por comprobar programáticamente una mutación porque requerirá una lectura consecuente.


Incluso estoy atrapado con el mismo problema. Sin embargo, descubrí que si la actualización o la inserción fallan, las definiciones de columna en el conjunto de resultados son más de una y si las mutaciones tienen éxito, la definición de la columna contiene solo una columna, es decir, "aplicada". El problema es que ResultSet no contiene el valor de la columna "aplicada" que es "verdadera" en caso de que la mutación sea exitosa y "falsa" cuando las transacciones impiden cambiar los datos. Estoy utilizando este truco a partir de ahora en mi aplicación, pero no creo que sea una buena solución, por lo que estoy buscando una solución mejor.


¿Hay alguna manera de averiguar cuántas filas fueron modificadas por una ACTUALIZACIÓN o eliminadas por un BORRAR?

Por lo que puedo decir, no, porque ELIMINAR o ACTUALIZAR es finalmente consistente. Es posible que un INSERT con nivel de consistencia ONE o LOCAL_ONE no se haya replicado completamente, y la mutación se haya realizado en otro host antes de que INSERT se haya replicado por completo. La mutación se seguirá aplicando, pero no se puede saber cuántas filas realmente se vieron afectadas.


Una solución que estoy usando para determinar si INSERT funcionó o no es para verificar los datos de ROW devueltos por ResultSet :

ResultSet rs = session.execute(bs); Row row = rs.one(); boolean insertFailed = row.getColumnDefinitions().contains("ownerid");

Aquí, ownerid es la clave de fila primaria. Puede usar su nombre de columna respectivo.