Java 和 MySQL - 提交和回滚

完成更改后,如果想要提交更改,则在连接对象上调用 commit() 方法,如下所示 −

conn.commit( );

否则,要回滚使用名为 conn 的连接对数据库进行的更新,请使用以下代码 −

conn.rollback( );

以下示例说明了提交和回滚对象的使用 −

try{
//假设一个有效的连接对象 conn
conn.setAutoCommit(false);
    语句 stmt = conn.createStatement();
    
    String SQL = "INSERT INTO Employees " +
    "VALUES (106, 20, 'Rita', 'Tez')";
    stmt.executeUpdate(SQL);
    //提交一个格式错误的 SQL 语句,该语句会中断
    String SQL = "INSERTED IN Employees " +
    "VALUES (107, 22, 'Sita', 'Singh')";
    stmt.executeUpdate(SQL);
    // 如果没有错误。
    conn.commit();
}catch(SQLException se){
    // 如果有错误。
    conn.rollback();
}

在这种情况下,上述 INSERT 语句均不会成功,所有内容都将回滚。

以下是使用 commitrollback 的示例。

此示例代码是根据前面章节中完成的环境和数据库设置编写的。

将以下示例复制并粘贴到 TestApplication.java 中,然后按如下方式编译并运行−

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class TestApplication {
   static final String DB_URL = "jdbc:mysql://localhost/TUTORIALSPOINT";
   static final String USER = "guest";
   static final String PASS = "guest123";
   static final String QUERY = "SELECT id, first, last, age FROM Employees";
   static final String INSERT_QUERY = "INSERT INTO Employees (first, last, age) values('Rita', 'Tez', 20)";
   static final String INSERT_QUERY_2 = "INSERT INTO Employees (first, last, age) values('Sita', 'Singh', 20)";

   public static void printResultSet(ResultSet rs) throws SQLException{
      // 确保我们从第一行开始
      rs.beforeFirst();
      while(rs.next()){
         // 显示值
         System.out.print("ID: " + rs.getInt("id"));
         System.out.print(", Age: " + rs.getInt("age"));
         System.out.print(", First: " + rs.getString("first"));
         System.out.println(", Last: " + rs.getString("last"));
      }
      System.out.println();
   }

   public static void main(String[] args) {

      Connection conn = null;
      Statement stmt = null;
      try{
            // 打开连接
            System.out.println("正在连接到数据库...");
            conn = DriverManager.getConnection(DB_URL,USER,PASS);
            
            // 将自动提交设置为false。
            conn.setAutoCommit(false);
            
            // 执行查询以创建语句,并传入 RS 示例所需的参数。
            System.out.println("正在创建语句...");
            stmt = conn.createStatement(
            ResultSet.TYPE_SCROLL_INSENSITIVE,
            ResultSet.CONCUR_UPDATABLE);
            
            // 在员工表中插入一行
            System.out.println("正在插入一行...");
            stmt.executeUpdate(INSERT_QUERY);
            
            // 在员工表中再插入一行
            stmt.executeUpdate(INSERT_QUERY_2);
            
            // 在此提交数据。
            System.out.println("在此提交数据...");
            conn.commit();
            
            // 现在列出所有可用记录。
            String sql = "SELECT id, first, last, age FROM Employees";
            ResultSet rs = stmt.executeQuery(sql);
            System.out.println("列出结果集以供参考....");
            printResultSet(rs);
            
            // 清理环境
            rs.close();
            stmt.close();
            conn.close();
      }catch(SQLException se){
         se.printStackTrace();
         // 如果有错误则回滚更改。
         System.out.println("Rolling back data here....");
         try{
            if(conn!=null)
               conn.rollback();
            }catch(SQLException se2){
               se2.printStackTrace();
            }
         }catch(Exception e){
            e.printStackTrace();
         }finally{
            // finally 块用于关闭资源
         try{
            if(stmt!=null)
               stmt.close();
         }catch(SQLException se2){
            se2.printStackTrace();
         } 
            try{
               if(conn!=null)
                  conn.close();
            }catch(SQLException se){
               se.printStackTrace();
         }
      }		   
   }
}

现在让我们编译上面的例子如下 −

C:\>javac TestApplication.java
C:\>

当您运行 TestApplication 时,它会产生以下结果 −

C:\>java TestApplication
Connecting to database...
Creating statement...
Inserting one row....
Commiting data here....
List result set for reference....
ID: 1, Age: 23, First: Zara, Last: Ali
ID: 2, Age: 30, First: Mahnaz, Last: Fatma
ID: 3, Age: 35, First: Zaid, Last: Khan
ID: 4, Age: 33, First: Sumit, Last: Mittal
ID: 5, Age: 40, First: John, Last: Paul
ID: 6, Age: 20, First: Rita, Last: Tez
ID: 7, Age: 20, First: Sita, Last: Singh
C:\>