更新を行うときに明示的にコミットする必要があるのはなぜですか?
質問
これが私のコードです:
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()
これは、同じ接続内でステートメントを複数挿入、更新、削除する場合に特に便利です。
所属していません StackOverflow