Tenho uma aplicação Java que se conecta ao Neo4j. Quero testar a capacidade de rollback do meu projeto, então criei um código de exemplo. Primeiro, abro uma sessão, executo uma transação de gravação e a comprometo. Após o encerramento da sessão, preciso reverter minha transação anterior (fora da sessão).
public class Neo4jTransactionExample {
public void main() {
createPersonsWithReference();
rollback();
}
public void createPersonsWithReference() {
try (Session session = driver.session()) {
session.writeTransaction(tx -> {
tx.run("CREATE (a:Person {name: 'Alice'})");
tx.run("CREATE (b:Person {name: 'Bob'})");
tx.run("MATCH (a:Person {name: 'Alice'}), (b:Person {name: 'Bob'}) CREATE (b)-[:KNOWS]->(a)");
return null;
});
}
}
public void rollback() {
}
}
Como faço para reverter após o encerramento da sessão?
As transações criadas em uma sessão são confinadas a essa sessão, portanto, você não pode reverter uma transação de fora dessa sessão.
Além disso, mesmo dentro de uma sessão, você não pode reverter uma transação depois que ela for confirmada (ou revertida). writeTransaction cria e confirma/reverte uma transação para você.
Sim, uma vez confirmado, está confirmado. Esse é realmente o objetivo do commit.
Se você precisar fazer isso, estará fazendo o rollback no nível de negócio (o que é um caso de uso válido). Você precisaria escrever o Cypher inverso em sua própria transação para desfazer o primeiro commit. Ou seja, excluir o relacionamento e os dois nós que você criou na primeira transação.
Dê uma olhada neste artigo https://en.wikipedia.org/wiki/ACID que deve ajudá-lo a entender os princípios de como as transações em um banco de dados ACID, como o Neo4j, funcionam.