jdbc---隔离级别

原文地址“http://z466459262.iteye.com/blog/769657

Java代码  收藏代码
隔离级别 
 
两个事务并发的读取一个东西。。。 
 
隔离级别 
 
读未提交(read uncommitted) :(可以读未提交的) 
 
问题是: 
-----脏读(如果他没提交就回滚了,那么你读出来的就是错误的信息) 
-----不可重复读(重复读时值不同)(我第一次读的是100。而第二次读的却是200,重复读取出来的数据不一致就叫不可重复读) 
-----幻读(重复读时条数不同)(比如我第一次查出来是5条数据,而这时有另一个线程插入了一条记录,如果我再去查的话,那么又多了,我们将这条记录 
称为幻影数据,) 
 
 
读已提交(read committed):因为只对读进行了控制,而没有对别人插入进行限制 
问题是: 
不可重复读(别人修改数据导致值不同) 
幻读(别人插入数据导致条数增加)----oracle的默认隔离级别,也就是说oracle只在别人先对数据修改的时候上锁,如果有人先读了,然后又有人修改了,那么他不上锁 
 
可重复读: 不但对读进行了控制,而且可以锁定我读的这条记录,那么当然别人改不了我读 
的这条记录 ---mysql的隔离级别 
 
问题是: 
  幻读----只对一条数据起作用,他没锁定整个表,当然我还可以插入 
 
 
串行化:锁定整个表,课串行化的意思就是不可并行化,那么对并发效率是有极大影响的 
 
java中设置隔离级别: 
conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMIT); 
 
 
String querysql = "select account from accounts where cardnum=? for update"; //注意这里加入了数据库的锁 
String updatesql = "update accounts set account = ? where cardnum = ?"; 
boolean flag = false; 
try{ 
  conn = JdbcUtils.getConnection(); 
  conn.setAutoCommit(false);  //并且设置了手动提交,如果不设置的话,将会自动提交 
  pstmt = conn.prepareStatement(querysql); 
  rs = pstmt.executeQuery(); 
  double oldMoney= -1 , newMoney = -1; 
  if(rs.next()){ 
      oldMoney = rs.getDouble("account"); 
      newMoney = Arith.sub(oldMoney,money); 
      if(newMoney>0){ 
         pstmt = conn.prepareStatement(updatesql); 
         pstmt.setDouble(1,newMoney); 
         pstmt.setString(2,cardNum); 
         int i = pstmt.executeUpdate(); 
         if(i>0)flag = true; 
      } 
      conn.commit(); 
  }catch(Exception e){ 
     throw e; 
  }finally{ 
      jdbcUtils.close(conn,rs,pstmt); 
  } 

猜你喜欢

转载自wangxiaoxu.iteye.com/blog/2195881
今日推荐