10

我是 Java JDBC 新手,开发了一个小型数据库应用程序。我正在学习O'Reilly - Database Programming with JDBC and Java 2nd Edition。

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();
                }
            }
        }
    }
}
4

2 回答 2

13

当您调用 时commit(),您完成/关闭当前事务。因此,由于rollback()撤消了当前事务中的任何更改(根据 javadoc),它实际上什么都不做。

于 2013-02-22T19:46:12.190 回答
5

con.rollback() 只有在 con.commit 不成功的情况下才有效吗?

YES而且如果你之前调用它也有效果con.commit。前提条件是连接的自动提交模式应该为 false 使用使用带有con.setAutoCommit(false)的JDBCcon.setAutoCommit(false)
使用 SQL 查询在数据库中进行的任何事务在被调用之前都不会提交到数据库。您在数据库中创建的最新提交事务充当该连接的保存点。当您调用con.rollback()时,您在此之后完成的所有事务都将被撤消。此外,如果在调用con.commit()时发生一些异常,则表示事务未保存在数据库中。在语句中调用 if是一个好习惯DMLcon.commit()savepointcon.rollback()catchcon.commit()失败。

于 2013-02-22T19:47:58.140 回答