Apoyo a las transacciones se ha añadido recientemente a los SDK de Couchbase. A partir de Spring Data Couchbase 5.0.0-M5se ha añadido soporte para transacciones a Spring Data Couchbase. En este blog, describiremos el uso de Spring Data @Transactional para aprovechar Couchbase Transactions.

En spring-data-couchbase contiene un spring-data-testapp que ejerce las transacciones. Se basa en la viaje-muestra en un servidor Couchbase local. (cualquier bucket con un índice primario será suficiente).

Se han añadido a AbstractCouchbaseConfiguration. Para permitir que la clase de interceptor de transacciones incorporada sea sobrescrita con CouchbaseTransactionInterceptor, asegúrese de que la siguiente línea está en el archivo aplicación.propiedades file:

aplicación.propiedades

La configuración de la transacción puede modificarse anulando la directiva configurarEntorno() en su clase que extiende AbstractCouchbaseConfiguration. Aquí fijamos el durabilityLevel a NONE para que podamos trabajar en nuestro clúster de un solo nodo.

Config.java

En la clase que los utilizará, tenemos que definir la plantilla como de costumbre y una referencia al objeto de servicio. Es importante tener en cuenta que el @Autowired rellena una variable con un objeto proxy. Este es un detalle importante, ya que los objetos proxy realizan el procesamiento antes y después de llamar al método real. Si se crea directamente el objeto de servicio desde su constructor, la anotación @Transactional no tendrá ningún efecto.

CmdRunner.java

El servicio se define con un @Servicio anotación. El constructor toma argumentos que son @Bean de forma que la infraestructura pueda crear un objeto proxy para @Autowired.

AirlineGateService.java

AirlineGateService.java (continuación)

Ahora usa todo lo que hemos construido:

  1. salva dos AirlineGates documentos, cada uno de los cuales indica 200 puertas
  2. verificar que se han salvado.
  3. ejecutar la transferGates() método del servicio para transferir 50 puertas de embarque de una compañía aérea a otra en una transacción.
  4. verificar que la transferencia se ha realizado.
  5. intento de ejecución transferGates() de nuevo, esta vez con una excepción que se produce después de guardar el primer documento.

    CmdRunner.java

Cómo funciona:

  • En TransactionInterceptor @Bean in AbstractCouchbaseConfiguration anula la función TransactionInterceptor para métodos anotados @Transactional.  
  • La anotación @Transactional hace que el proxy de AirportGatesService para utilizar el TransactionInterceptor para llamar al método anotado utilizando el método CouchbaseCallbackTransactionManager.  
  • En CouchbaseCallbackTransactionManager inicializa una transacción y luego llama al método de servicio real en el contexto de la transacción. 
  • Si la llamada al método tiene éxito, el CouchbaseCallbackTransactionManager confirma la transacción. 
  • Si la consignación se realiza correctamente, se devuelve la llamada. 
  • Si la confirmación falla con una excepción reintentable, la función CouchbaseCallbackTransactionManger reintentará el proceso completo de inicializar una nueva transacción, ejecutar el método de servicio real y luego confirmar la transacción. 

En CouchbaseCallbackTransactionManager repetirá esta operación hasta que la confirmación tenga éxito o se haya alcanzado el número máximo de reintentos.

Opciones para los próximos pasos

Autor

Publicado por Michael Reiche, Ingeniero Superior de Software

5 Comentarios

  1. Hola amigos - el proyecto couchbase/transactions aún no se ha fusionado con spring-data-examples. Estará disponible en breve.
    - Mike

  2. El ejemplo de transacción necesita spring-boot-starter-data-couchbase 3.0.0-RC2 para ejecutarse debido a una incompatibilidad con reactor en otras versiones 3.0.0*.

  3. Hola Michael, Gracias por implementar el soporte de transacciones couchbase incorporado. Funciona muy bien cuando uso "couchbase transacción" utilizando el cubo único, pero tengo un error en las transacciones utilizando con múltiples cubos.

    He implementado este enlace https://github.com/spring-projects/spring-data-couchbase/issues/878. Esta implementación no funciona con las transacciones. ¿Tiene alguna idea?

  4. Michael Reiche abril 3, 2023 a 12:45 pm

    Spring Data Couchbase Transactions no funcionará con multi-buckets ya que los multi-buckets en Spring Data Couchbase requieren múltiples conexiones a Couchbase y la transacción debe estar en una única conexión.
    - Mike

Dejar una respuesta