¿Por qué la necesidad de comprometerse explícitamente al hacer una actualización?
Pregunta
Aquí está mi código:
import cx_Oracle
conn = cx_Oracle.connect(usr, pwd, url)
cursor = conn.cursor()
cursor.execute("UPDATE SO SET STATUS='PE' WHERE ID='100'")
conn.commit()
Si quito el conn.commit()
, la tabla no se actualiza. Sin embargo, para las instrucciones de selección, no necesito que conn.commit()
. Tengo curiosidad por qué?
Solución
El DB-API spec requiere que la conexión a la base de datos comienza una nueva transacción, de manera predeterminada. Debe commit
confirmar los cambios que realice, o rollback
para descartarlos.
Tenga en cuenta que si la base de datos es compatible con una función de auto-commit, esto debe ser inicialmente fuera.
declaraciones SELECT
puros, ya que nunca hacen cualquier cambio en la base de datos, no tiene que tener sus cambios confirmados.
Otros consejos
confirmación se utiliza para establecer la base de datos para guardar todos los cambios en la transacción actual.
Seleccione no cambia los datos de modo que no hay nada para salvar y por lo tanto nada de cometer
Wikipedia para las transacciones
Otros han explicado por qué una confirmación no es necesario en una instrucción SELECT. Sólo quería señalar que podría utilizar la propiedad autocommit
de la de conexión objeto de evitar tener que ejecutar manualmente comprometerse:
import cx_Oracle
with cx_Oracle.connect(usr, pwd, url) as conn:
conn.autocommit = True
cursor = conn.cursor()
cursor.execute("UPDATE SO SET STATUS='PE' WHERE ID='100'")
cursor.close()
Esto es especialmente útil cuando se tiene Inserción múltiple, UPDATE y DELETE en la misma conexión.