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 语句均不会成功,所有内容都将回滚。
以下是使用 commit 和 rollback 的示例。
此示例代码是根据前面章节中完成的环境和数据库设置编写的。
将以下示例复制并粘贴到 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:\>