21

这是我的代码:

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(). 我很好奇为什么?

4

3 回答 3

27

默认情况下,DB-API规范要求连接到数据库开始一个新事务。您必须commit确认所做的任何更改,或rollback放弃它们。

请注意,如果数据库支持自动提交功能,则最初必须关闭。

SELECT语句,因为它们从不对数据库进行任何更改,因此不必提交更改。

于 2010-05-17T09:54:03.603 回答
7

commit 用于告诉数据库保存当前事务中的所有更改。

Select 不会更改任何数据,因此无需保存任何内容,因此无需提交任何内容

有关交易,请参阅维基百科

于 2010-05-17T09:51:53.937 回答
6

其他人已经解释了为什么 SELECT 语句不需要提交。我只是想指出您可以利用Connectionautocommit对象的属性来避免自己手动执行提交:

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 语句时,这尤其有用。

于 2017-09-26T21:54:51.200 回答