Почему необходимо совершать явно при выполнении ОБНОВЛЕНИЕ? - PullRequest
9 голосов
/ 17 мая 2010

Вот мой код:

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(). Мне интересно, почему?

Ответы [ 3 ]

20 голосов
/ 17 мая 2010

Спецификация DB-API требует, чтобы по умолчанию при подключении к базе данных начиналась новая транзакция. Вы должны commit подтвердить свои изменения или rollback отменить их.

Обратите внимание, что если база данных поддерживает функцию автоматической фиксации, она должна быть изначально отключена.

Чистые SELECT операторы, так как они никогда не вносят никаких изменений в базу данных, их изменения не обязательно фиксируются.

6 голосов
/ 17 мая 2010

commit используется, чтобы указать базе данных сохранить все изменения в текущей транзакции.

Выбор не изменяет никакие данные, поэтому нечего сохранять и, следовательно, нечего фиксировать

См. Википедия для транзакций

1 голос
/ 27 сентября 2017

Другие объяснили, почему фиксация не требуется в операторе SELECT. Я просто хотел отметить, что вы можете использовать свойство autocommit объекта Connection , чтобы избежать необходимости выполнять коммит вручную:

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

Это особенно полезно, когда у вас есть несколько операторов INSERT, UPDATE и DELETE в одном соединении.

...