jdbc---隔离级别

隔离级别

两个事务并发的读取一个东西。。。

隔离级别

读未提交(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);
  }
}

你可能感兴趣的:(oracle,mysql,jdbc)