Perché la necessità di impegnarsi in modo esplicito quando si fa un aggiornamento?

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

  •  27-09-2019
  •  | 
  •  

Domanda

Ecco il mio codice:

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()

Se rimuovo il conn.commit(), la tabella non viene aggiornata. Ma per selezionare le dichiarazioni, non ho bisogno che conn.commit(). Sono curioso di sapere perchè?

È stato utile?

Soluzione

Il DB-API spec richiede che la connessione al database inizia una nuova transazione, per impostazione predefinita. È necessario commit per confermare le modifiche apportate o rollback di disfarsene.

  

Si noti che se il database supporta una funzione di auto-commit, questo deve essere inizialmente spento.

dichiarazioni SELECT Pure, dal momento che non fanno mai alcuna modifica al database, non c'è bisogno di avere i loro cambiamenti commessi.

Altri suggerimenti

commit viene utilizzato per indicare il database per salvare tutte le modifiche nella transazione corrente.

Seleziona non cambia i dati in modo non c'è nulla da salvare e quindi niente di impegnarsi

wikipedia per le transazioni

Altri hanno spiegato perché un commit non è necessario in un'istruzione SELECT. Volevo solo far notare che si potrebbe utilizzare la proprietà autocommit del connessione oggetto per evitare di dover eseguire manualmente impegnarsi:

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()

Questo è particolarmente utile quando si dispone di inserire più, UPDATE e DELETE all'interno della stessa connessione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top