在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
oracle 事务隔离级别 事务不同引发的状况: 脏读(Dirty reads) 一个事务读取另一个事务尚未提交的修改时,产生脏读 很多数据库允许脏读以避免排它锁的竞争。 不可重复读(Nonrepeatable reads) 同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生非重复读。 幻读(Phantom reads) 同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻像读。 数据库操作的隔离级别 未提交读(read uncommitted) 提交读(read committed) 重复读(repeatable read) 序列化(serializable) oracle默认隔离级别read committed (statement level serialization) 每一个语句,在语句开始时,会获取一个此刻的数据快照。 一个事务有多条语句,如果语句之间存在其它完成的事务,这可能引起不可持续读和幻读。 新建一个测试表books: name,code,price三个字段 添加两条测试数据 使用pl/sql和java程序模拟并发 复制代码 代码如下: //获取连接 省略 pstat = conn.prepareStatement("select price from books where code='qqq'"); rs = pstat.executeQuery(); while(rs.next()){ System.out.println("price:"+rs.getDouble(1)); } close(); 输出结果:price:15.0 复制代码 代码如下: update books set price=18 where code='qqq'; !pl/sql设置成手动更新,不自动更新 在执行java查询: 会有不可重复读何幻读的现象发生就不用测试了吧, 隔离级别:重复读(repeatable read) 隔离级别:serializable 当A事物执行a,b的时候,若有B事物执行更新操作,是有可能的 例子: 复制代码 代码如下: //获取连接和关闭连接代码 省略 //不自动提交 conn.setAutoCommit(false); /** * a 查询 */ pstat = conn.prepareStatement("select price from books where code='qqq'"); rs = pstat.executeQuery(); while(rs.next()){ //输出 price:25.0 System.out.println("price:"+rs.getDouble(1)); } close(); /** * 暂停一会,用pl/sql执行B事务 * update books set price=15 where code='qqq'; * commit; */ Thread.sleep(10000); /** * 如果这里再执行a查询的话,和第一次查询结果就不一样,因为中间有B事务的提交更新 * 修改,这也是不可重复读 */ //b 更新 pstat = conn.prepareStatement("update books set price=price+10 where code='qqq'"); pstat.executeUpdate(); close(); //c 查询 pstat = conn.prepareStatement("select price from books where code='qqq'"); rs = pstat.executeQuery(); while(rs.next()){ //输出 还是price:25.0 ,因为B事务的干预 System.out.println("price:"+rs.getDouble(1)); } close(); //提交事务 conn.commit(); if(conn != null){ conn.close(); } 上面执行的顺序,事务B是在A的执行过程中执行的。 以上通过实例介绍了oracle数据库隔离级别的相关内容,希望对大家有所帮助。
|
请发表评论