为什么setAutoCommit(false)在JDBC中不起作用?

时间:2019-12-15 12:16:06

标签: java mysql jdbc

我正在尝试使用JDBC为正在开发的应用程序进行事务,但是Connection#setAutoCommit(false)似乎无法正常工作。这是代码:

String insertCliente = "INSERT INTO Cliente VALUES (?,?,?,?,?,?)";
String vendiAuto = "{CALL VendiAuto(?,?,?,?)}";
try
{
    connection.setAutoCommit(false);

    PreparedStatement statement1 = connection.prepareStatement(insertCliente);
    CallableStatement statement2 = connection.prepareCall(vendiAuto);
    statement1.setString(1,CF);
    statement1.setString(2,nome);
    statement1.setString(3,cognome);
    statement1.setDate(4,new Date(new GregorianCalendar(anno,mese,giorno).getTimeInMillis()));
    statement1.setString(5,luogo);
    statement1.setString(6,sesso);
    statement2.setString(1,codice);
    statement2.setString(2,venditore);
    statement2.setString(3,CF);
    statement2.setBigDecimal(4,prezzoVendita);

    statement1.execute();
    statement2.execute();

    connection.commit();
}
catch (SQLException e)
{
    connection.rollback();
    throw e;
}
finally
{
    connection.setAutoCommit(true);
}

如果statement2.execute()失败,尽管调用了statement1.execute()connection.rollback()仍然有效。
也许我做错了。
我不知道该怎么解决。你能帮我吗?
使用的DBMS是MySQL 8.0.18,表引擎是InnoDB。

1 个答案:

答案 0 :(得分:1)

我发现connection.setAutoCommit(false)与我的存储过程有冲突:在该过程中,已经有一个事务(用START TRANSACTION定义),并以某种方式与该语句冲突。
我解决了从存储过程中删除事务的问题。