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

推荐订阅源

Martin Fowler
Martin Fowler
Microsoft Security Blog
Microsoft Security Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Vercel News
Vercel News
Y
Y Combinator Blog
D
DataBreaches.Net
IT之家
IT之家
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园_首页
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
H
Hackread – Cybersecurity News, Data Breaches, AI and More
WordPress大学
WordPress大学
H
Help Net Security
GbyAI
GbyAI
C
Check Point Blog
L
LangChain Blog
小众软件
小众软件
T
The Blog of Author Tim Ferriss
MyScale Blog
MyScale Blog
G
Google Developers Blog
月光博客
月光博客
V
V2EX
M
MIT News - Artificial intelligence
博客园 - 叶小钗

博客园 - 冯东

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