JDBC:只有在调用commit()方法不成功时,对rollback()方法的调用是否有效?

时间:2013-02-22 19:33:45

标签: java jdbc commit rollback

我是Java JDBC的新手,并开发了一个小型数据库应用程序。我正在学习 O'Reilly - 使用JDBC和Java第二版进行数据库编程。

con.rollback()仅在con.commit不成功时生效吗?

我预计即使con.rollback()成功,调用con.commit()也会产生影响。换句话说,将其用作“撤消”操作。

我在con.rollback()成功后尝试调用con.commit(),但它没有按预期工作。那么好吗/预期呢?

这个例子来自我上面提到的那本书:

con.rollback()的调用已被注释掉。它接近con.close()之前的结尾。我试着取消注释并运行它。但是,con.rollback()con.commit()成功后不会回滚。

import java.sql.*;
import java.util.logging.Level;
import java.util.logging.Logger;

public class UpdateLogic
{

    public static void main(String args[])
    {
        Connection con = null;

        try
        {
            String driver = "com.mysql.jdbc.Driver";
            Class.forName(driver).newInstance();
            String url = "jdbc:mysql://localhost:3306/Company";
            Statement s;
            con = DriverManager.getConnection(url, "root", "");
            con.setAutoCommit(false); // make sure auto commit is off!
            s = con.createStatement();// create the first statement
            s.executeUpdate("INSERT INTO employee VALUES ('1', 'employee 1', '22','00-1234' )");

            s.close(); // close the first statement
            s = con.createStatement(); // create the second statement
            s.executeUpdate("INSERT INTO employee VALUES ('2', 'employee 2', '21','00_4321' )");

            con.commit(); // commit the two statements
            System.out.println("Insert succeeded.");
            s.close(); // close the second statement
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException ex)
        {
            Logger.getLogger(UpdateLogic.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException e)
        {
            if (con != null)
            {
                try
                {
                    con.rollback();
                } // rollback on error
                catch (SQLException i)
                {
                }
            }
            e.printStackTrace();
        } finally
        {
            if (con != null)
            {
                try
                {
                  //con.rollback();
                    con.close();
                } catch (SQLException e)
                {
                    e.printStackTrace();
                }
            }
        }
    }
}

2 个答案:

答案 0 :(得分:10)

当您致电commit()时,您将完成/关闭当前交易。因此,由于rollback()撤消当前事务中的任何更改(根据javadoc),它将无效地执行任何操作。

答案 1 :(得分:4)

  

con_rollback()只有在con.com未成功的情况下才有效吗?

如果您在con.commit之前调用它,它也会生效。先决条件是使用con.setAutoCommit(false)来自动提交连接模式应为false 使用带有 con.setAutoCommit(false) 的JDBC的DML SQL查询在数据库中进行的任何事务都不会在调用con.commit()之前提交到数据库。您在数据库中创建的最新提交事务将充当该连接的 savepoint 。当您致电 con.rollback() 之后,在savepoint撤消之后您完成的所有交易。此外,如果在调用 con.commit() 时发生某些异常,则表示事务未保存在数据库中。如果con.rollback()失败,最好在catch语句中调用con.commit()