为什么更新时需要显式提交?
这是我的代码:
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 个回答
9
10
其他人已经解释了为什么在SELECT语句上不需要提交(commit)。我只是想指出,你可以利用Connection对象的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()
当你在同一个连接中有多个INSERT、UPDATE和DELETE语句时,这个功能特别有用。
30
DB-API 规范要求,连接到数据库时默认会开始一个新的事务。这意味着你所做的任何更改都需要通过 commit
来确认,或者通过 rollback
来放弃。
需要注意的是,如果数据库支持自动提交功能,这个功能在开始时必须是关闭的。
纯粹的 SELECT
语句,因为它们不会对数据库进行任何更改,所以不需要进行提交。