¿Por qué la necesidad de comprometerse explícitamente al hacer una ACTUALIZACIÓN?

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 conn.commit() , la tabla no se actualiza. Pero para declaraciones selectas, no necesito que conn.commit() . Tengo curiosidad por qué?

La especificación DB-API requiere que la conexión a la base de datos comience una nueva transacción, de manera predeterminada. Debes commit a confirmar cualquier cambio que rollback o rollback para descartarlos.

Tenga en cuenta que si la base de datos admite una función de confirmación automática, esta debe estar desactivada inicialmente.

Las declaraciones Pure SELECT , ya que nunca hacen ningún cambio en la base de datos, no tienen que confirmar sus cambios.

commit se utiliza para indicar a la base de datos que guarde todos los cambios en la transacción actual.

Select no cambia ningún dato, por lo que no hay nada que guardar y, por lo tanto, nada que cometer

Ver Wikipedia para transacciones

Otros han explicado por qué un compromiso no es necesario en una instrucción SELECT. Solo quería señalar que podría utilizar la propiedad autocommit del objeto Connection para evitar tener que ejecutar el compromiso manualmente:

 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 tiene varias instrucciones INSERT, UPDATE y DELETE dentro de la misma conexión.