JDBC中的事务
相关理基础:数据库事务 相关博客:JDBC工具类
语法:try{
conn.setAutoCommit(false);//开启事务
......
conn.commit();// try的最后提交事务 (注意:一定要在最后一条语句才提交事务)
} catch() {
conn.rollback();//回滚事务
} finally {
conn.setAutoCommit(true); // 还原事务的提交方式
conn.close();
}
注意: 一定要在try语句块的最后一条语句才提交事务
,否则,不管业务代码是否抛出异常,都会设置事务自动提交,都会提交异常之前的业务代码。
public static void main(String[] args) throws SQLException {
Connection conn = DBUtil.getConnection();
try {
conn.setAutoCommit(false); // 设置事务提交为手动
Statement stmt1 = conn.createStatement();
stmt1.executeUpdate("insert into tb_dept (dname,loc) values('a','aaaaa')");
System.out.println(3 / 0);
Statement stmt2 = conn.createStatement();
stmt2.executeUpdate("insert into tb_dept (dname,loc) values('b','bbbbb')");
conn.commit(); //最后一条语句提交事务
} catch (SQLException e) {
conn.rollback();
e.printStackTrace();
} finally {
if(conn!=null){
conn.setAutoCommit(true); // 还原事务的提交方式
conn.close();
}
}
}
说明
如果不把事务提交放在try语句块的最后,会报错:
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
try {
conn = DBUtil.getConnection();
conn.setAutoCommit(false);//开启事务
String nickname = "aa";
String account = "aaaaaaa";
String sql = "insert into tb_user (nickname,account) values(?,?)";
ps = conn.prepareStatement(sql);
ps.setString(1, nickname);
ps.setString(2, account);
ps.executeUpdate();
conn.commit(); //try的最后提交事务
System.out.println(3 / 0); // 报错
} catch (SQLException e) {
try {
conn.rollback();//回滚事务
} catch (SQLException ex) {
ex.printStackTrace();
}
} finally {
try {
conn.setAutoCommit(true); // 还原事务的提交方式
DBUtil.release(null, ps, conn);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
上面代码,程序报错,但仍然能将数据提交到数据库