2011-9-15 jdbc事务

来源:互联网 发布:小米网络音响连接电脑 编辑:程序博客网 时间:2024/04/25 14:17
 

    2011-9-15 事务   晴
  刚写好的笔记竟然丢了,怎么这么不小心啊。只有重写了。之后明白自己的笨拙是一件好事吧,好好的写,慢慢来。会好的,至少今天的myeclipse终于重装好了,自己的日子还是要自己过好。希望真的能更好……
所谓事务:是指一组原子操作(一组SQL语句执行)的工作单元。
这个工作单元中的所有原子操作在进行期间,与其他事务隔离,免于因数据来源的交相更新而发生混乱,事务中的所有原子操作要么全部执行成功,要么全部失败。
创建JDBC的事务主要分以下步骤:
设置事务的提交方式为非自动提交:conn.setAutoCommit(false); 
将需要添加事务的代码放在try、catch块中:
try {
  //需要添加事务的业务代码
} catch (SQLException e) {
  ...
}
在try块内添加提交操作,表示操作无异常,提交事务:conn.commit();   //正常流程,提交事务
在catch块内添加回滚事务,表示操作出现异常,撤消事务:conn.rollback();   //发生异常,撤消事务

Statement的execute()等方法一次只能执行一条SQL语句,如果同时有多条SQL语句要执行的话,可以使用addBatch()方法将要执行的SQL语句加入进来,然后执行executeBatch()方法,这样就可以在一次方法调用中执行多条SQL语句,以提高执行效率。
为了保证这一批语句要么全部成功,要么全部失败,应该把批处理放置在事务中进行。
使用PreparedStatement也可以进行批处理。
注意:批处理中执行的语句只能是更新语句(insert、delete、update),否则会抛出异常
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Savepoint;

public class TestTransaction {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  Connection con=null;
  PreparedStatement pst=null;
  Savepoint sp=null;
  try {
   con=JdbcUtil.getConnection();
   
   con.setAutoCommit(false);
   con.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
   String str="delete from student where id=3";
   pst=con.prepareStatement(str);
   
   System.out.println("第一条sql语句。。");
   pst.executeUpdate();
   sp=con.setSavepoint();
   System.out.println("第二条sql语句...");
   str="insert into student(id,name) values(2,'ttt')";
   pst=con.prepareStatement(str);
   pst.executeUpdate();
   con.commit();
   System.out.println("事务完成...");
   
   
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
   try {
    con.rollback(sp);
    con.commit();
   } catch (SQLException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
   }
  }finally{
   try {
    con.setAutoCommit(true);
   } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   JdbcUtil.release(null,pst, con);
  }
  
 }

}

原创粉丝点击