jdbc---隔离级别

[code]
隔离级别

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

隔离级别

读未提交(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);
}
}
[/code]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值