zoukankan      html  css  js  c++  java
  • Oracle锁定选出的结果集

        经常会遇到这样的情况,用SQL读取一些数据,然后根据数据进行一些处理。比如学生的学号是依次递增的,通常会用下面的方法来取得并生成一个学号
    select max(sno) as sno from students;
    程序取得sno然后插入
    insert into students values(sno+1,...);
    这种方法平时可能没有问题,但是存在这样一种情况A、B两个用户几乎同一时间操作,A先执行了select max(sno) 操作,在A取得最大学号但没有完成插入或者提骄傲操作时B也执行了select max(sno) 操作,此时A、B取到的 sno是一样的。但是这种情况是不允许出现的,怎样避免这种情况呢?
    对选中的行上锁!
    针对上面的sql语句需要小的改动
    select sno from students sno=(select max(sno) from students) fro update;
    这时Oracle将会锁定选中的行,如果没有commit活rollback操作的话,在他后面执行的语句将会陷入等待状态。这样就可以解决类似上面的问题了。A先执行了select max(sno) 操作,在A取得最大学号但没有完成插入或者提骄傲操作时B也执行了select max(sno) 操作,因为这一行被加上了串行锁,所以B用户只好等待,等A用户执行了commit操作,B用户才有返回结果,这样一来就避免了取得同一个值的问题。

  • 相关阅读:
    函数的逻辑读成零
    SQL逻辑读变成零
    体系结构中共享池研究
    执行计划基础 动态采样
    执行计划基础 统计信息
    识别低效率的SQL语句
    oracle 知识
    XPATH 带命名空间数据的读取
    ACTIVITI 研究代码 之 模版模式
    ACTIVITI 源码研究之命令模式执行
  • 原文地址:https://www.cnblogs.com/interboy/p/1286777.html
Copyright © 2011-2022 走看看