Ran*_*ang 4 oracle concurrency thread-safety
伪代码:
开始存储过程
承诺
检查第a行//第1步的值列1
更新第a行第2行的第1列
承诺
结束存储过程
这个sp线程安全吗?
Declare
tag_rec prep_tag%ROWTYPE;
begin
COMMIT;
SELECT * INTO tag_rec
FROM PREP_TAG
WHERE project = 'a' and categoryId = 'b';
if tag_rec.locked = 'No' then
UPDATE prep_tag
SET locked = 'Yes'
WHERE TAG_NUMBER = tag_rec.TAG_NUMBER;
end if;
COMMIT;
end;
Run Code Online (Sandbox Code Playgroud)
这个sp线程安全吗?是否有可能线程A检查了tag_rec.locked ='否',那么它即将更新它.但在它之前,线程B偷偷进入并且还看到tag_rec.locked ='不'?
对你的问题的简短回答是否定的,这不是线程安全的.其他一些会话可以进入并更新SELECT和UPDATE语句之间的prep_tag.
答案很长,你做错了.听起来您想更新这些记录的锁定字段.你也可以这样做:
UPDATE prep_tag SET locked = 'Yes'
WHERE project = 'a'
AND categoryId = 'b'
AND locked = 'No'
Run Code Online (Sandbox Code Playgroud)
一个声明,它保证是原子的.
此外,假设此次交易还有更多内容,我建议不要在您的区块内进行.
| 归档时间: |
|
| 查看次数: |
5251 次 |
| 最近记录: |