Java EE中事务处理

时间:2021-04-02 21:59:11

1、事务
  情景:在银行转账时,要对数据库进行两个操作,即将一个账户的钱减少,将另一个账户的钱增多。但是由于操作的先后顺序,如果在两个操作之间发生故障,则会导致数据不一致。因此,需要设计一个事务,在两条语句都被执行成功后,数据修改才被真正提交(Commit)放入数据库,否则数据操作回滚(Rollback)。
  在默认情况下,executeUpdate函数会在数据库中提交改变的结果,此时,可以用Connection来定义该函数是否自动提交改变结果,并进行事务的提交或者回滚。下面来看一段代码:

  import java.sql.Connection;
  import java.sql.DriverManager;
  import java.sql.Statement;
  public class Transaction {
  public static void main(String[] args) throws Exception {
  Connection conn = null;
  try {
   Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
   conn = DriverManager.getConnection("jdbc:odbc:DSSchool");
   Statement stat = conn.createStatement();
   conn.setAutoCommit(false);// 设置为不要自动提交
  String sql1 = "update Tstudent set age=25 where id=4";
  String sql2 = "update Tstudent set name='suuw150' where id=4";
  stat.executeUpdate(sql1);
  stat.executeUpdate(sql2);
  conn.commit(); // 提交以上sql1,sql2事务
  } catch (Exception ex) {
  conn.rollback(); // 回滚
  } finally {
  conn.close();
   }
   }
  }
从以上代码可以看出,Connection中可以设置executeUpdate不要自动提交,代码如下:
  conn.setAutoCommit(false);
 以下代码的意思是是在两条sql语句运行后,提交这个操作:
   stat.executeUpdate(sql1);
stat.executeUpdate(sql2);

 
发生异常后,执行后的修改将会回退: 
  conn.rollback();
这样就保证了两条语句要么全部执行,要么全部不执行。