回滚的意义---JDBC事务回滚探究

时间:2024-12-21 12:05:38

JDBC手动事务提交回滚的常见写法一直是rollback写在commit的catch之后:

try{
conn.setAutoCommit(false);
  ps.executeUpdate();   ps.executeUpdate();   conn.commit(); }catch(Exception e){
conn.rollback();
}

但是,这种回滚是没有意义的:

一旦commit前出错,  就不提交了,  回滚无用

一旦commit了,    说明没错,   不用回滚

找到一篇和我观点相同的文章:

<JDBC 事务的回滚 提交>

我以为无需回滚,即使真要回滚,需要将commit写在主要业务的try...catch之后,一旦主要业务中途出错,回滚.

回滚的意义---JDBC事务回滚探究

表:JDBC事务3种写法回滚比较

import java.sql.*;

public class TestJDBC {

    public static final String URL = "jdbc:mysql://127.0.0.1/test";
public static final String USER_NAME = "root";
public static final String USER_PWD = "root"; private static Connection conn = null;
private static PreparedStatement ps; private static void connOpen() throws SQLException {
conn = DriverManager.getConnection(URL, USER_NAME, USER_PWD);
} private static void connClose() throws SQLException {
if (ps != null) {
ps.close();
ps = null;
}
if (conn != null) {
conn.close();
conn = null;
}
} private static void testRollBack() throws SQLException {
connOpen();
try { conn.setAutoCommit(false); String strSQL = "INSERT INTO customer(uname,pwd) VALUES(?,'1')";
ps = conn.prepareStatement(strSQL); // 插入一条数据
ps.setString(1, "悟空");
ps.executeUpdate(); // 出异常
if (true) {
throw new SQLException();
} // 再插入一条数据
ps.setString(1, "八戒");
ps.executeUpdate(); // conn.commit();
} catch (Exception e) {
System.out.println("异常!");
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
}
try {
conn.commit();
} catch (SQLException e) {
e.printStackTrace();
}
connClose(); } private static void selectAll() throws SQLException {
connOpen();
ps = conn.prepareStatement("select * from customer");
ResultSet rs = ps.executeQuery();
while (rs.next()) {
System.out.print(rs.getString(2) + " : ");
System.out.println(rs.getString(1));
}
connClose();
} public static void main(String[] args) throws SQLException {
testRollBack();
selectAll();
}
}

相关文章