Pourquoi la nécessité d'engager explicitement lorsque vous faites une mise à jour?

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

  •  27-09-2019
  •  | 
  •  

Question

Voici mon code:

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 je retire le conn.commit(), la table est pas mis à jour. Mais pour les instructions select, je ne ai pas besoin que conn.commit(). Je suis curieux de savoir pourquoi?

Était-ce utile?

La solution

Le DB-API spec nécessite que la connexion à la base de données commence une nouvelle transaction, par défaut. Vous devez commit pour confirmer toutes les modifications apportées, ou rollback les jeter.

  

Notez que si la base de données prend en charge une fonctionnalité de validation automatique, cela doit être d'abord au large.

Déclarations de SELECT pur, car ils ne font jamais des modifications à la base de données, ne pas avoir leurs changements engagés.

Autres conseils

validation est utilisé pour indiquer la base de données pour enregistrer toutes les modifications de la transaction en cours.

Sélectionnez ne change pas de données donc il n'y a rien à sauver et donc rien à commettre

Voir wikipedia pour les transactions

D'autres ont expliqué pourquoi Commit est pas nécessaire sur une instruction SELECT. Je voulais juste signaler que vous pourriez utiliser la propriété autocommit du Connexion objet pour éviter d'avoir à exécuter manuellement vous engager:

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

Ceci est particulièrement utile lorsque vous avez plusieurs INSERT, UPDATE et DELETE dans le même connexion.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top