代码之家  ›  专栏  ›  技术社区  ›  tshepang Arrie

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

  •  8
  • tshepang Arrie  · 技术社区  · 14 年前

    以下是我的代码:

    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() ,表未更新。但是对于select语句,我不需要它 康纳提交() . 我很好奇为什么?

    3 回复  |  直到 7 年前
        1
  •  17
  •   tshepang Arrie    10 年前

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

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

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

        2
  •  6
  •   mmmmmm    14 年前

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

    选择不更改任何数据,因此没有要保存的内容,因此没有要提交的内容。

    wikipedia 对于交易

        3
  •  1
  •   Erik Anderson    7 年前

    其他人解释了为什么在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语句时,这尤其有用。