什么是Connection.setAutoCommit(false);何时使用Oracle数据库?

时间:2016-10-06 08:02:58

标签: java database oracle jdbc

我在创建连接后立即设置con.setAutoCommit(false);,以便在未提交的数据库中没有任何内容。但事实证明,如果关闭连接,无论你的setAutoCommit()状态是什么,都将提交所有事务。

    Class.forName("oracle.jdbc.driver.OracleDriver");
        con = DriverManager.getConnection("jdbc:oracle:thin:@192.168.7.5:xxxx:xxx", "xxx", "xxx");

        con.setAutoCommit(false);

        st = con.createStatement();
        String sql = "INSERT INTO emp (eid, name, dob, address) VALUES (?, ?, ?, ?)";
        PreparedStatement statement = con.prepareStatement(sql);
        statement.setInt(1, 8 );
        statement.setString(2, "kkk" );
        statement.setDate(3, date );
        statement.setString(4, "pppp" );
        pst = con.prepareStatement(sql);
        int rowsInserted = statement.executeUpdate();

        //con.commit ();

        System.out.println ("rowsInserted "+rowsInserted);

        con.close ();

即使在连接关闭时插入了con.commit ();行,所以我想知道con.commit ();有什么用?

Another answer表示其特定供应商:

  

如果在没有显式提交或回滚的情况下关闭Connection; JDBC并不特别强制要求任何内容,因此行为取决于数据库供应商。如果是Oracle,则会发出隐含提交。

没有意义。谢谢。

3 个答案:

答案 0 :(得分:1)

AutoCommit是一个显式提交,您可以在必须提交事务时调用它。在您的情况下,虽然您已将false设置为<script> $(document).ready(function () { var data = { labels: [ "" ], datasets: [ { data: [165], backgroundColor: [ "#FF6384" ], hoverBackgroundColor: [ "#FF6384" ] }] }; var ctx = $('#chart-area').get(0).getContext("2d"); var myDoughnutChart = new Chart(ctx, { type: 'doughnut', data: data, animation: true, responsive: true, showTooltips: false, percentageInnerCutout: 70, segmentShowStroke: false, onAnimationComplete: function () { var canvasWidthvar = $('#chart-area').width(); var canvasHeight = $('#chart-area').height(); var constant = 114; var fontsize = (canvasHeight / constant).toFixed(2); //ctx.font="2.8em Verdana"; ctx.font = fontsize + "em Verdana"; ctx.textBaseline = "middle"; var total = 0; $.each(data, function () { total += parseInt(this.value, 10); }); var tpercentage = ((data[0].value / total) * 100).toFixed(2) + "%"; console.log(total); var textWidth = ctx.measureText(tpercentage).width; var txtPosx = Math.round((canvasWidthvar - textWidth) / 2); ctx.fillText(tpercentage, txtPosx, canvasHeight / 2); } }); }); ,但没有明确的提交或回滚。 Oracle数据库提交会话的所有事务,这些事务优雅地退出连接。如果会话异常终止,则会回滚事务。

答案 1 :(得分:1)

Oracle documentation提供了一个非常好的解释,说明何时以及为何应该使用它。请仔细阅读!

如果JDBC连接是以编程方式或默认情况下处于自动提交模式(默认情况下为fyi),则每个SQL语句在完成后都会提交给数据库。

您可以参考this问题获取有关同一主题的更详细说明。

答案 2 :(得分:1)

注销Oracle会提交任何待处理的事务。无论您是通过conn.close()使用sqlplus还是JDBC驱动程序,都会发生这种情况。请注意,它不是发出提交服务器的驱动程序。在注销期间,服务器会提交挂起的更改。在Java程序中,如果要确保未提交挂起的更改,则可以在调用conn.rollback()之前调用conn.close()

您问conn.commit()有什么用?它用于在业务逻辑的特定点显式提交事务。例如,如果在连接池中缓存连接,则可以在将连接释放回池之前禁用自动提交并提交挂起的更改。有些人更喜欢启用自动提交模式(这是JDBC中的默认模式),而不用担心显式提交或回滚更改。这取决于您的业务逻辑。您可以问自己:我是否需要回滚DML执行?如果答案是肯定的,那么你应该禁用自动提交并显式提交事务。