更新を行うときに明示的にコミットする必要があるのはなぜですか?

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

  •  27-09-2019
  •  | 
  •  

質問

これが私のコードです:

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

削除した場合 conn.commit(), 、テーブルは更新されていません。しかし、選択したステートメントの場合、私はそれを必要としません conn.commit(). 。なぜ興味がありますか?

役に立ちましたか?

解決

DB-API 仕様には、データベースに接続すると、デフォルトで新しいトランザクションが開始される必要があります。絶対です commit あなたが行った変更を確認するために、または rollback それらを捨てる。

データベースが自動コミット機能をサポートしている場合、これは最初にオフにする必要があることに注意してください。

ピュア SELECT ステートメントは、データベースに変更を加えることはないため、変更をコミットする必要はありません。

他のヒント

コミットは、現在のトランザクションのすべての変更を保存するためにデータベースに指示するために使用されます。

Selectはデータを変更しないので、保存するものは何もないため、コミットするものは何もありません

見る ウィキペディア トランザクション用

他の人は、選択されたステートメントでコミットが必要ない理由を説明しました。私はあなたが利用できることを指摘したかっただけです autocommit のプロパティ 繋がり 手動で実行する必要がないようにオブジェクトにコミットします。

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

これは、同じ接続内でステートメントを複数挿入、更新、削除する場合に特に便利です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top