Por que a necessidade de se comprometer explicitamente ao fazer uma atualização?

StackOverflow https://stackoverflow.com/questions/2847999

  •  27-09-2019
  •  | 
  •  

Pergunta

Aqui está o meu código:

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

Se eu remover o conn.commit(), a tabela não é atualizada. Mas para declarações selecionadas, não preciso disso conn.commit(). Estou curioso por quê?

Foi útil?

Solução

o Db-api As especificações exigem que a conexão com o banco de dados inicie uma nova transação, por padrão. Você deve commit Para confirmar as alterações que você faz, ou rollback para descartá -los.

Observe que, se o banco de dados suportar um recurso de compromisso automático, isso deverá estar inicialmente desligado.

Puro SELECT As declarações, como nunca fazem alterações no banco de dados, não precisam ter suas mudanças cometidas.

Outras dicas

O Commit é usado para informar ao banco de dados para salvar todas as alterações na transação atual.

Selecionar não altera nenhum dado para que não haja nada a salvar e, portanto, nada para se comprometer

Ver Wikipedia para transações

Outros explicaram por que uma confirmação não é necessária em uma instrução SELECT. Eu só queria ressaltar que você poderia utilizar o autocommit propriedade do Conexão Objeta -se para evitar ter que executar manualmente se comprometer:

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

Isso é especialmente útil quando você tem várias instruções de inserção, atualização e exclusão dentro da mesma conexão.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top