Transações

Uma transação é uma unidade de trabalho que pode compreender uma ou mais operações SQL. Normalmente cada operação SQL é executada e a mudança é comprometida (tornada permanente) no banco de dados, exatamente depois da declaração SQL ser executada.

Porém, em alguns casos, um conjunto de operações SQL precisa ser bem sucedido, ou falhar, como um todo. Se uma das declarações SQL falhar, as outras declarações SQL no grupo também precisam ser retornadas. Considere o seguinte cenário.

Em uma loja on-line, um cliente compra vários livros. Quando o cliente sai e paga, usando um cartão de crédito, as seguintes coisas podem acontecer:

1- Um registro precisa ser acrescentado à tabela Orders, especificando o pedido, incluindo o endereço de entrada e os detalhes de cartão de crédito. Essa operação resulta em um Orderid usado para identificar cada item na tabela OrderDetails.
2- Um registro precisa ser inserido na tabela OrderDetails para cada item de compra. Cada item é vinculado à tabela Orders, usando o valor OrderId retornado pela operação SQL anterior.

Agora, se tudo correr suavemente, ambas as declarações SQL serão executadas com sucesso no banco de dados. Porém, as coisas podem sair erradas. Digamos, por exemplo, que a primeira operação foi comprometida com sucesso, mas a segunda declaração SQL falhou. Nesse caso, os detalhes de pedido são perdidos e o cliente não obterá nada. O cartão de crédito do cliente será debitado com a quantia da compra, no entanto, pois um registro é acrescentado à tabela Orders.

Nesse caso, você quer que ambas as declarações SQL sejam bem sucedidas ou falhem, como um todo. Isso pode ser feito usando uma transação. Quando há uma transação que falhou, você pode notificar o cliente, para que ele, ou ela, tente novamente.

Por padrão, a posição de auto comprometimento do objeto Connection é verdadeira, significando que o banco de dados é atualizado quando uma declaração SQL é executada. Se você quiser agrupar um conjunto de declarações SQL em uma transação, primeiro precisará dizer ao objeto Connection para não atualizar a mudança até que ele seja explicitamente notificado a faze-lo. Isso pode ser feito chamando o método setAutoCommit e passando falso como seu argumento, como a seguir:

Depois, você pode executar, normalmente, todas as declarações SQL no grupo, usando os métodos executeQuery e updateQuery. Depois da última chamada ao método executeQuery ou updateQuery, você chama o método commit do objeto Connection, para tornar as mudanças de banco de dados permanentes, assim

Se você não chamar o método commit dentro de um tempo específico, todas as declarações SQL serão retornadas depois de chamar o método seAutoCommit. Alternativamente, você pode retornar explicitamente a transação, chamando o método rollback do objeto Connection:

trecho estraído do livro “Java para a Web com Servlets, JSP e EJB” - Autor Budi Kurniawan - Editora Ciência Moderna