惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Y
Y Combinator Blog
博客园_首页
雷峰网
雷峰网
V
V2EX
博客园 - 司徒正美
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - Franky
月光博客
月光博客
Hugging Face - Blog
Hugging Face - Blog
WordPress大学
WordPress大学
T
Tailwind CSS Blog
小众软件
小众软件
博客园 - 叶小钗
美团技术团队
酷 壳 – CoolShell
酷 壳 – CoolShell
Apple Machine Learning Research
Apple Machine Learning Research
IT之家
IT之家
MyScale Blog
MyScale Blog
Blog — PlanetScale
Blog — PlanetScale
大猫的无限游戏
大猫的无限游戏
Jina AI
Jina AI
人人都是产品经理
人人都是产品经理
H
Help Net Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻

博客园 - 冯东

Oracle问题诊断过程常用SQL Cognos10 RedHat5.4 X64 安装记录 不用JavaScript实现列表排序(利用钻取实现) 从命令行启动Cognos的方法 如何让列表实现任意字段类型的排序 如何使导出的excel和报表分页设置不一样 基于Oracle触发器的报表版本保存工具 Cognos重建CSK JS屏蔽Cognos报表右键菜单 - 冯东 - 博客园 利用JS重写Cognos右键菜单 Cognos亲和力解释 Java中Split函数的问题 - 冯东 - 博客园 修改Oracle数据库的字符集 面试题 北漂,真的来了 通过修改Linux服务自动启动指定应用程序 Oracle自动启动(解决了Failed to auto-start Oracle Net Listene和Message 1053 not found错误) 由于系统时间修改导致Oracle启动失败 - 冯东 - 博客园 Oracle中删除包含物化视图的表空间的方法
Oracle锁定选出的结果集
冯东 · 2008-09-08 · via 博客园 - 冯东

    经常会遇到这样的情况,用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用户才有返回结果,这样一来就避免了取得同一个值的问题。