Commit(); no 'try' ou no 'finally'?

7 respostas
Rage

Pessoal, vejo muita gente fazendo isso:

static void AtualizaStatus(String[] rg, String st_xx, String dt_stxx, String co_campo_xx) throws Exception, SQLException, ClassNotFoundException
	{		
		try 
		{						
			conn.setAutoCommit(false);
			pstmt = conn.prepareStatement(strQuery);
			pstmt.executeUpdate();			
		}
		catch(SQLException e) 
		{ 
			conn.rollback();
			e.printStackTrace();
			System.out.println(query);
		}
		finally	
		{ 			
conn.commit();			
closeConnection(conn, pstmt, rs); 			
		}
	}

Mas assim, se der algum erro na transação, ele vai cair no catch, realizar o rollback e logo depois vai fazer o commit, o que não faz sentido e não tem lógica…
Por isso vejo que o ideal é isso:

static void AtualizaStatus(String[] rg, String st_xx, String dt_stxx, String co_campo_xx) throws Exception, SQLException, ClassNotFoundException
	{		
		try 
		{						
			conn.setAutoCommit(false);
			pstmt = conn.prepareStatement(strQuery);
			pstmt.executeUpdate();			
conn.commit();			
		}
		catch(SQLException e) 
		{ 
			conn.rollback();
			e.printStackTrace();
			System.out.println(query);
		}
		finally	
		{ 			
closeConnection(conn, pstmt, rs); 			
		}
	}

Com o commit() no try ele só é executado se for tudo certo, caso contrário faz o rollback e depois facha os objetos…
Se eu estiver errado, alguém me corrija.
[]´s!

7 Respostas

nbluis

Tecnicamente dá no mesmo.

Mas logicamente está perfeito…

felipealbuquerque

Está correto. Realmente não faz sentido fazer o commit no finally.

fpavao

Nunca vi commit no finally ? alguém já usou ?

L

Corretíssimo.

Mas ainda assim, eu trocaria a estrutura por um try-try-finally-catch, assim eu não deixo escapar a exceção quando dá SQLException no close. E ainda troco o printStackTrace e o sysout por uma exceção minha da aplicação. assim:

static void AtualizaStatus(String[] rg, String st_xx, String dt_stxx, String co_campo_xx) throws Exception, ClassNotFoundException
	{		
		try
		{
			try 
			{						
				conn.setAutoCommit(false);
				pstmt = conn.prepareStatement(strQuery);
				pstmt.executeUpdate();			
				conn.commit();			
			}
			finally	
			{ 			
				closeConnection(conn, pstmt, rs); 			
			}
		}
		catch(SQLException e) 
		{ 
			throws new StatusException(e);
		}
	}
Robsonramosabrao

O commit tem que ser no try e o rollback tem que ser catch…

Nao tem nada de errado nisso.

Rage

Leonardo3001:
Corretíssimo.

Mas ainda assim, eu trocaria a estrutura por um try-try-finally-catch, assim eu não deixo escapar a exceção quando dá SQLException no close. E ainda troco o printStackTrace e o sysout por uma exceção minha da aplicação. assim:

static void AtualizaStatus(String[] rg, String st_xx, String dt_stxx, String co_campo_xx) throws Exception, ClassNotFoundException
	{		
		try
		{
			try 
			{						
				conn.setAutoCommit(false);
				pstmt = conn.prepareStatement(strQuery);
				pstmt.executeUpdate();			
				conn.commit();			
			}
			finally	
			{ 			
				closeConnection(conn, pstmt, rs); 			
			}
		}
		catch(SQLException e) 
		{ 
			throws new StatusException(e);
		}
	}


AAhm!
Muito interessante.
No método closeConnection, que eu uso para fechar os objetos, eu verifico antes de fechá-los se estão nulos, acredito que a maior possibilidade de dar Exception alí seria isto ( tentar fechar um objeto que está null ) , mas prevenir é sempre bom, vai que dá algum outro erro!

[]´s!

Andre_JavaWorld

O java nao permite manipulacao de banco de dados sem usar o velho try catch, a clausula finally serve como um “tratamento pos erro” ou seja, o codigo que voce precisa executar caso haja um erro ou nao, voce pode imaginar algumas situacoes do tipo, e se o sistema der um erro, o sistema devera salvar os dados digitados? isso nao causaria corrupcao do banco por relacionamentos e outros campos que talvez nao estivessem preenchidos? e sabemos que a conexao tem que ser sempre fechada, entao o metodo commit(), deve ser dado no catch, e o metodo que voce definiu para desconectar o banco no finally; desculpem se eu estiver errado, mas lembrem da frase abaixo…

Criado 7 de dezembro de 2007
Ultima resposta 9 de dez. de 2007
Respostas 7
Participantes 7