事务
什么是事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败。
1.操作:
- 开启事务
- 提交事务
- 回滚事务
2.使用Connection对象来管理事务
开启事务:setAutoCommit(boolean autoCommit)调用该方法设置参数为false,即开启事务
提交事务:commit()
回滚事务:rollback()
看下面代码:
import com.ujiuye.CRUD.JDBCUtil.JDBCUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class Test08 {
public static void main(String[] args) {
Connection con = null;
PreparedStatement pre1 = null;
PreparedStatement pre2 = null;
//1.获取连接
try {
con = JDBCUtil.getConnection();
String sql1 = "update account set balance = balance - ? where id = ?";
String sql2 = "update account set balance = balance + ? where id = ?";
pre1 = con.prepareStatement(sql1);
pre2 = con.prepareStatement(sql2);
pre1.setInt(1,500);
pre1.setInt(2,1);
pre2.setInt(1,500);
pre2.setInt(2,2);
pre1.executeUpdate();
pre2.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtil.close(pre1,con);
JDBCUtil.close(pre2,null);
}
}
}
这个代码正常执行的时候结果如下:
zhangsan少了500
lisi多了500
但是如果我们在数据库操作中手动添加一个异常,模拟特殊情况,代码如下:
pre1.executeUpdate();
int i = 3 / 0;
pre2.executeUpdate();
这种情况下会导致运行到 i = 3/0这一句代码的时候出现异常,被catch捕获,从而导致 pre2.executeUpdate();这句代码不执行。
实际结果:
所以为了保证事务的完整性,我们就要使用,Connection类中的方法,保证事务的完整性。
代码如下:
import com.ujiuye.CRUD.JDBCUtil.JDBCUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class Test08 {
public static void main(String[] args) {
Connection con = null;
PreparedStatement pre1 = null;
PreparedStatement pre2 = null;
//1.获取连接
try {
con = JDBCUtil.getConnection();
String sql1 = "update account set balance = balance - ? where id = ?";
String sql2 = "update account set balance = balance + ? where id = ?";
con.setAutoCommit(false);//开启事务
pre1 = con.prepareStatement(sql1);
pre2 = con.prepareStatement(sql2);
pre1.setInt(1,500);
pre1.setInt(2,1);
pre2.setInt(1,500);
pre2.setInt(2,2);
pre1.executeUpdate();
pre2.executeUpdate();
con.commit();//事务执行完毕了才提交事务
} catch (Exception e) {
try {
if (con != null)con.rollback();//如果出现了异常,导致事务没有执行完毕,回滚该事务
} catch (SQLException ex) {
ex.printStackTrace();
}
e.printStackTrace();
}finally {
JDBCUtil.close(pre1,con);
JDBCUtil.close(pre2,null);
}
}
}