加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Oracle存储过程是否是线程安全的?

发布时间:2020-12-12 13:12:50 所属栏目:百科 来源:网络整理
导读:伪代码: 开始存储过程 提交 检查第a行//第1步的值列1 更新第a行第1行的第1行 提交 结束存储过程 这个sp线程安全吗? 编辑: Declare tag_rec prep_tag%ROWTYPE;begin COMMIT; SELECT * INTO tag_rec FROM PREP_TAG WHERE project = 'a' and categoryId = 'b
伪代码:

>开始存储过程
>提交
>检查第a行//第1步的值列1
>更新第a行第1行的第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;

这个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'

一个声明,它保证是原子的.

此外,假设此次交易还有更多内容,我建议不要在您的区块内进行.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读