Puedo ver un error interno del servidor en mi aplicación desarrollada en spring mvc, usando wildfly como servidor web y la base de datos es PostgreSQL . ¿Qué significa esta excepción?
ERROR: cannot execute nextval() in a read-only transactionAntes funcionaba todo bien. Traté de buscar la solución aquí en stackoverflow pero no encontré nada que pudiera solucionar este problema.
La función nextval() se utiliza para incrementar una secuencia, lo que modifica el estado de la base de datos.
Obtiene ese error porque está en una transacción de solo lectura. Esto puede suceder porque
Inició explícitamente una transacción de solo lectura con START TRANSACTION READ ONLY o similar.
El parámetro de configuración default_transaction_read_only está on .
Está conectado a un servidor en espera de replicación de transmisión.
Si default_transaction_read_only está on , puede iniciar una transacción de lectura y escritura con
START TRANSACTION READ WRITE; o cambie la configuración editando postgresql.conf o con el comando de superusuario
ALTER SYSTEM SET default_transaction_read_only = off;Como otros han señalado, nextval() en realidad actualiza la base de datos para obtener una nueva secuencia, por lo que no se puede usar en una transacción que está marcada como de solo lectura.
Como está usando Spring , sospecho que esto significa que está usando el soporte de transacciones de Spring. Si está utilizando el soporte de transacciones basado en anotaciones, obtendrá una transacción de solo lectura si tiene
@Transactional(readOnly=true)Eso significa que cuando Spring comience la transacción, la pondrá en modo de solo lectura.
Elimine el readOnly=true y, en su lugar, se crea una transacción de escritura regular.
Control de transacciones Spring en http://docs.spring.io/spring-framework/docs/4.2.x/spring-framework-reference/html/transaction.html
Quiero decir exactamente lo que dice, aquí hay un ejemplo:
t=# create sequence so49; CREATE SEQUENCE t=# begin; BEGIN t=# select nextval('so49'); nextval --------- 1 (1 row) t=# set transaction_read_only TO on; SET t=# select nextval('so49'); ERROR: cannot execute nextval() in a read-only transaction t=# end; ROLLBACKSupongo que se conectó como el llamado usuario ro, que es un usuario con "transaction_read_only" establecido en verdadero, EG:
t=# select rolconfig from pg_roles where rolname ='ro'; rolconfig ---------------------------- {transaction_read_only=on} (1 row)puede desactivar eso para su usuario, por supuesto, pero creo que esto está fuera del alcance
https://www.postgresql.org/docs/current/static/sql-set-transaction.html