¿Por qué la necesidad de comprometerse explícitamente al hacer una actualización?

StackOverflow https://stackoverflow.com/questions/2847999

  •  27-09-2019
  •  | 
  •  

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é?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top