为什么更新时需要显式提交?

24 投票
3 回答
72753 浏览
提问于 2025-04-15 22:47

这是我的代码:

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

commit是用来告诉数据库保存当前操作中的所有更改的。

Select操作不会改变任何数据,所以没有东西需要保存,自然也就没有东西可以提交。

想了解更多关于事务的内容,可以查看维基百科

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 语句,因为它们不会对数据库进行任何更改,所以不需要进行提交。

撰写回答