一、为什么要用到事务?
为了防止批量插入时产生脏数据。在批量插入时,如果插入过程中途因某个sql语句错误而导致插入停止,那么在这之前插入的数据就是脏数据。这时,就需要用到事务处理,将批量插入的数据“打包”成一个整体,这样在进行插入操作时,只要有一个数据不正确,整体的数据就不会提交,有效防止了脏数据的产生。
二、事务如何使用?
把连续执行的一系列SQL语句(主要是DML语句)视为一个整体,这个整体指的是开启事务到结束事务的中间过程。
过程:
- 开启事务–取消自动提交
con.setAutocommit(false)
- 提交事务–用
commit
主动提交事务来更新数据 - 回滚事务–使用
rollback
将数据回滚到事务开启时
代码:
package package1;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class TestStudent {
public static void main(String[] args) {
//获取连接
Connection con = JDBCutil.getConnection();
PreparedStatement st = null;
String sql1 = "update student set age=age+10 where name='张飞'";
String sql2 = "update student set age=age+20 where name='张飞'";
String sql3 = "update student set age=age+30 where name='张飞'";
try {
con.setAutoCommit(false);//取消自动提交--开启事务
st=con.prepareStatement(sql1);
st.executeUpdate();
st=con.prepareStatement(sql2);
st.executeUpdate();
st=con.prepareStatement(sql3);
st.executeUpdate();
con.commit();//自动提交
System.out.println("修改成功!");
} catch (SQLException e) {
e.printStackTrace();
try {
con.rollback();//事务回滚 ,出错时会回滚到事务开启时
} catch (SQLException e1) {
e1.printStackTrace();
}
System.out.println("出现异常!");
}
}
}
数据库数据:
2.1 正确操作时:
正常操作下(sql语句无错误),代码的执行及结果:
这时年龄是正确修改的。
2.2 错误操作时:
当有一条数据不正确时,比如下面的情况:
String sql2 = "update student set age1=age+20 where name='张飞'";
这时的运行结果如下:
此时数据库的数据时不变化的。即使正确执行的sql1也没有执行,有效防止了脏数据的产生。
2.3 (反例)脏数据产生的情况
代码(这是没有加事务回滚的哦 ):
package package1;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class TestStudent {
public static void main(String[] args) {
//获取连接
Connection con = JDBCutil.getConnection();
PreparedStatement st = null;
String sql1 = "update student set age=age+10 where name='张飞'";
String sql2 = "update student set age1=age+20 where name='张飞'";//错误语句
String sql3 = "update student set age=age+30 where name='张飞'";
try {
st=con.prepareStatement(sql1);
st.executeUpdate();
st=con.prepareStatement(sql2);
st.executeUpdate();
st=con.prepareStatement(sql3);
st.executeUpdate();
System.out.println("修改成功!");
} catch (SQLException e) {
e.printStackTrace();
System.out.println("出现异常!");
}
}
}
数据库:
执行结果:
虽然抛出了异常,但是sql1的却得到了执行,而sql2和sql3未能执行。注入的sql1就是“脏数据”,这个数据本不该出现却出现了,这在项目开发中是严令禁止的!!!