MySql aceita rollback?

Olá,

Estou tentando fazer duas inserções no banco de tal forma que se uma for feita a outra deverá ser feita. No entanto gostaria de que se algo der errado na segunda inserção a primeira fosse desfeita. Para isso estou usando cn.rollback() e quando verifica o erro, a primeira inserção não é desfeita.

public boolean ExecutaSQL() throws ErrosBD, SQLException {

		Connection cn = null;
		PreparedStatement stmt = null;
		boolean fezSQL1 = false;
                                boolean fezSQL2 = false;
		try {
			
			cn = Conexao.getConnection(ConexaoPlenamente.DRIVER[local], // Driver
									   Conexao.BANCO[local], // Endereço do banco
									   Conexao.LOGIN[local], // Login
									   Conexao.SENHA[local]); //Senha
			
                                                    cn.setAutoCommit(false);

			StringBuffer SQL = new StringBuffer();
			SQL.append("Insert into pessoa (nome) values ('André')");
			
			stmt = cn.prepareStatement(SQL.toString());
			
			if (stmt.executeUpdate() == 1) {
				fezSQL = true;
			} else {
				fezSQL = false;
			}
			
			StringBuffer SQL2 = new StringBuffer();
			SQL2.append("Insert into pessoa (nome2) values ('André')");
			
			stmt2 = cn.prepareStatement(SQL2.toString());
			
			if (stmt2.executeUpdate() == 1) {	
				fezSQL2 = true;
			} else {
				fezSQL2 = false;
			}
			
			cn.setAutoCommit( true );

			return fezSQL1 && fezSQL2;

		} catch (SQLException e) {
			
				cn.rollback();
				throw new ErrosBD(ErrosBD.ERRO_SQL, e);
		} finally {
			Conexao.close(stmt);
			Conexao.close(cn);
		}	
	}

Porém quando visualizo no banco a primeira inserção é feita enquanto a segunda da erro. Como resolver isso.

Minha pergunta então é: MySql aceita cn.rollback(); ?
Ou este banco é porco mesmo?

Você criou as tabelas usando o default, que não aceita transações e rollback.
Recrie as tabelas usando InnoDB.
Repita: o MySQL não é porco (senão o Yahoo não o usaria); você é que não sabe usar direito :wink:

Os dois bancos (MySQL e PostgreSQL) têm defaults que afastam um pouco aquelas pessoas que precisam avaliar um banco para fazer um projeto, mas “trombam” nessa primeira dificuldade.

  • Default do MySQL: criar databases que não suportam transações - isso faz com que as pessoas achem que o MySQL não suporte transações (isso era em 1930…)
  • Default do PostgreSQL: só aceitar conexões na máquina local, via Unix Sockets apenas (recurso de segurança) - isso faz com que o pessoal ache que o PostgreSQL não está funcionando de jeito nenhum, ou que só funciona para a máquina local.
    É por isso que muita gente ainda usa o MS-Access e o ODBC - é tão difícil de configurar quanto MySQL ou PostgreSQL, mas as pessoas estão acostumadas com configuração de ODBC (o Zé que montou a Lan House lá na esquina sabe direitinho isso). Então o sistema acaba “bombando” quando você tenta usá-lo em uma aplicação J2EE.