Para agentes de IA: um índice de documentação está disponível em https://www.mongodb.com/pt-br/docs/llms.txt — as versões de markdown de todas as páginas estão disponíveis anexando .md a qualquer caminho de URL.
Menu Docs

Transações

Neste guia, você pode aprender como usar o driver PyMongo para executar transações. As transações permitem que você execute uma série de operações que não alteram nenhum dado até que a transação seja confirmada. Se qualquer operação na transação retornar um erro, o driver cancelará a transação e descartará todas as alterações de dados antes que elas se tornem visíveis.

No MongoDB, as transações são executadas dentro de sessões lógicas . Uma sessão é um agrupamento de operações de leitura ou escrita relacionadas que você pretende executar sequencialmente. As sessões permitem que você execute operações em uma transação compatível com ACID, que é uma transação que atende a uma expectativa de atomicidade, consistência, isolamento e durabilidade. O MongoDB garante que os dados envolvidos em suas operações de transação permaneçam consistentes, mesmo que as operações encontrem erros inesperados.

Ao usar o PyMongo, você pode criar uma nova sessão a partir de uma instância MongoClient como tipo ClientSession . Recomendamos que você reutilize seu MongoClient para várias sessões e transações, em vez de criar um novo cliente a cada vez.

Aviso

Utilize uma ClientSession apenas com o MongoClient (ou MongoDatabase ou MongoCollection associada) que a criou. Utilizar uma ClientSession com um MongoClient diferente resulta em erros de operação.

O MongoDB permite consistência causal nas sessões do cliente. O modelo de consistência causal garante que as operações dentro de uma sessão sejam executadas em uma ordem causal. Os clientes observam resultados consistentes com as relações causais ou as dependências entre as operações. Por exemplo, se você executar uma série de operações em que uma operação depende logicamente do resultado de outra, todas as leituras subsequentes refletirão o relacionamento de dependência .

Observação

Uma sessão de cliente permite a consistência causal mesmo que não seja realizada uma transação.

A tabela a seguir descreve as garantias que as sessões causalmente consistentes oferecem:

Garantia
Descrição

Ler suas gravações

As operações de leitura refletem os resultados das operações de gravação anteriores.

Leituras monotônicas

As operações de leitura não retornam resultados que reflitam um estado de dados anterior a uma operação de leitura anterior.

Escritas monotônicas

Se uma operação de gravação precisar preceder outras operações de gravação, o driver executará essa operação de gravação primeiro.

Por exemplo, se você chamar insert_one() para inserir um documento e, em seguida, chamar update_one() para modificar o documento inserido, o driver executará a operação de inserção primeiro.

Escritas que seguem as leituras

Se uma operação de gravação precisar seguir outras operações de leitura, o driver executará primeiro as operações de leitura.

Por exemplo, se você chamar find() para recuperar um documento e, em seguida, chamar delete_one() para excluir o documento recuperado, o driver executará primeiro a operação de localização.

Em uma sessão causalmente consistente, o MongoDB garante a consistência causal apenas entre as seguintes operações:

  • Operações de leitura que têm uma preocupação de leitura majority

  • Operações de escrita que têm preocupação de gravação majority

Dica

Para saber mais sobre os conceitos mencionados nesta seção, consulte as seguintes entradas de manual do MongoDB Server :

Os exemplos neste guia usam a collection sample_restaurants.restaurants dos conjuntos de dados de amostra do Atlas. Para saber como criar um cluster gratuito do MongoDB Atlas e carregar os conjuntos de dados de amostra, consulte o tutorial Introdução ao PyMongo .

Após iniciar uma sessão usando o método start_session() , você pode gerenciar o estado da sessão usando os seguintes métodos fornecidos pelo ClientSession retornado :

Método
Descrição

start_transaction()

Inicia uma nova transação, configurada com as opções fornecidas, nesta sessão. Retorna um erro se já houver uma transação em andamento para a sessão. Para aprender mais sobre esse método, consulte a página startTransaction() no manual do servidor.

Parâmetros: read_concern, write_concern, read_preference, max_commit_time_ms
Tipo de retorno: ContextManager

abort_transaction()

Termina a transação ativa para esta sessão. Retorna um erro se não houver uma transação ativa para a sessão ou se a transação tiver sido confirmada ou encerrada. Para saber mais sobre esse método, consulte a página abortTransaction() no manual do servidor.

commit_transaction()

Confirma a transação ativa para esta sessão. Retorna um erro se não houver nenhuma transação ativa para a sessão ou se a transação tiver sido encerrada. Para saber mais sobre esse método, consulte a página commitTransaction() no manual do servidor.

with_transaction()

Inicia uma transação nesta sessão e executa callback uma vez, em seguida, confirma a transação. No evento de uma exceção, este método pode tentar novamente a confirmação ou toda a transação, o que pode invocar a chamada de resposta várias vezes por uma única chamar para with_transaction().

Parâmetros: callback, read_concern, write_concern, read_preference, max_commit_time_ms
Valor de retorno: O resultado da função callback

bind()

Vincula a sessão a todas as operações do banco de dados no escopo de um gerenciador de contexto. Chame este método em um objeto ClientSession e, em seguida, use o resultado como um gerenciador de contexto. Isso remove a necessidade de passar session para cada operação individual.

Parâmetros: end_session (Opcional, padrão para True)
Tipo de retorno: _BoundSessionContext

end_session()

Termina esta sessão. Se uma transação começou, este método a aborta. Retorna um erro se não houver nenhuma sessão ativa para encerrar.

Um ClientSession também tem métodos para recuperar propriedades da sessão e modificar propriedades da sessão mutáveis. Para saber mais sobre esses métodos, consulte a documentação da API.

Importante

Se você chamar bind(end_session=False), deverá chamar end_session() explicitamente quando terminar de usar a sessão para evitar vazá-la. O seguinte código mostra padrões de uso corretos e incorretos:

# Incorrect: leaks the session because no reference exists to call
# end_session() on once finished with it
with client.start_session().bind(end_session=False):
...
# Correct: end_session=True by default, so session ends automatically
with client.start_session().bind():
...
# Correct: session variable allows explicit cleanup
with client.start_session() as s, s.bind(end_session=False):
...
s.end_session()
# Correct: nested context managers
with client.start_session() as s:
with s.bind():
...

O exemplo a seguir mostra como você pode criar uma sessão, criar uma transação e confirmar uma operação de inserção de vários documentos por meio das seguintes etapas:

  1. Crie uma sessão a partir do cliente usando o método start_session(). Vincule-o a todas as operações no bloco chamando o método bind().

  2. Use o método with_transaction() para iniciar uma transação.

  3. Insere vários documentos. Como a sessão está vinculada, você pode omitir o argumento session de cada operação. O método with_transaction() executa a operação de inserção e confirma a transação. Se qualquer operação resultar em erros, o with_transaction() cancelará a transação. Este método garante que a sessão feche corretamente quando o bloco sair.

  4. Feche a conexão com o servidor usando o método client.close() .

Selecione a aba Synchronous ou Asynchronous para ver o código correspondente:

# Establishes a connection to the MongoDB server
client = MongoClient("<connection string>")
# Defines the database and collection
restaurants_db = client["sample_restaurants"]
restaurants_collection = restaurants_db["restaurants"]
# Function performs the transaction
def insert_documents(session):
restaurants_collection_with_session = restaurants_collection.with_options(
write_concern=WriteConcern("majority"),
read_concern=ReadConcern("local")
)
# Inserts documents within the transaction
restaurants_collection_with_session.insert_one(
{"name": "PyMongo Pizza", "cuisine": "Pizza"}, session=session
)
restaurants_collection_with_session.insert_one(
{"name": "PyMongo Burger", "cuisine": "Burger"}, session=session
)
# Starts a client session
async with client.start_session() as session:
try:
# Uses the with_transaction method to start a transaction, execute the callback, and commit (or abort on error).
session.with_transaction(insert_documents)
print("Transaction succeeded")
except (ConnectionFailure, OperationFailure) as e:
print(f"Transaction failed: {e}")
# Closes the client connection
client.close()
# Establishes a connection to the MongoDB server
client = AsyncMongoClient("<connection string>")
# Defines the database and collection
restaurants_db = client["sample_restaurants"]
restaurants_collection = restaurants_db["restaurants"]
# Function performs the transaction
async def insert_documents(session):
restaurants_collection_with_session = restaurants_collection.with_options(
write_concern=WriteConcern("majority"),
read_concern=ReadConcern("local")
)
# Inserts documents within the transaction
await restaurants_collection_with_session.insert_one(
{"name": "PyMongo Pizza", "cuisine": "Pizza"}, session=session
)
await restaurants_collection_with_session.insert_one(
{"name": "PyMongo Burger", "cuisine": "Burger"}, session=session
)
# Starts a client session
with client.start_session() as session:
try:
# Uses the with_transaction method to start a transaction, execute the callback, and commit (or abort on error).
await session.with_transaction(insert_documents)
print("Transaction succeeded")
except (ConnectionFailure, OperationFailure) as e:
print(f"Transaction failed: {e}")
# Closes the client connection
await client.close()

Se você precisar de mais controle sobre suas transações, poderá usar o método start_transaction() . Você pode usar esse método com os métodos commit_transaction() e abort_transaction() descritos na seção anterior para gerenciar manualmente o ciclo de vida da transação.

Observação

Operações paralelas não suportadas

O PyMongo não suporta a execução de operações paralelas em uma única transação.

Se você estiver usando o MongoDB Server v8.0 ou posterior, poderá executar operações de gravação em vários namespaces em uma única transação, chamando o método bulk_write() em uma instância do MongoClient. Para obter mais informações, consulte o guia de Operações de Gravação em Massa.

Para saber mais sobre os conceitos mencionados neste guia, consulte as seguintes páginas no manual do MongoDB Server :

Para saber mais sobre a ACID compliance, consulte Quais são as propriedades ACID nos sistemas de gerenciamento de banco de dados? artigo no site do MongoDB .

Para saber mais sobre qualquer um dos tipos ou métodos discutidos neste guia, consulte a seguinte documentação da API: