请问:多台机子同时对同一个数据库的同一个存储过程进行调用是否存在,并发性的问题,也就是同时交叉性运行存储过程中的语句.希望能得到一个合理的原理性解释.

解决方案 »

  1.   

    我觉得和其他程序语言一样,同一段代码可以多个调用同时进行,不会有冲突
    会产生冲突的只是对共享区域的操作,比如oracle执行sql修改数据
      

  2.   

    当然存在这种情况了。
    这就需要你写的存储过程要合理,否则就可能发生死锁现象。
    假如你的存储过程中有update tableA,update tableB,update tableA的情况,就极有可能在并发是发生死锁。
    如果修改一下顺序为update tableA,update tableA,uptdateB就会把发生死锁的情况降低很多很多。
      

  3.   

    oracledbalgtu 多谢你上面的解答.上面你提到了回滚可能这种方法不可取,而扩大锁的范围是什么意思,具体怎么操作,能不能给个例子?
      

  4.   

    SELECT * FROM tt;
    如下内容:
    1 0  8
    2 1  16
    3 2  12
    ;LOCK TABLE tt IN EXCLUSIVE MODE NOWAIT;
    UPDATE tt SET a4=2 WHERE a4=2; 
    UPDATE tt SET a4=1 WHERE a4=1; 
    commit;
    上面的方法就不会因为并发而产生死锁,因为tt这个表被整个锁定了,其它session无法修改,
    只能等待操作进程完成后,才能再次获得表锁。
      

  5.   

    oracle 9i & 10g 编程艺术  讲这种并发性等相关问题比较好,可以参考一下。
      

  6.   

    谢谢,oracledbalgtu 以下是我在网络上找到的资料,并不是很理解好像与上面你讲有所相反,能不能帮忙解析,小弟先谢了,分必给,只是为了求一个明白.
    网络资料:
    所谓的oracle存储过程,无非就是把大量的SQL集中在一起加入了变量循环等。
    简单地看它就也就是对几个数据库对象的访问。 
    我们知道oracle数据库对象的访问是有锁机制的,同一时间内 
    只有一个用户能访问这样的对象,(最底的行级锁) 
    可以想象如个2个人同时对一个对象的同一个内容进行处理那 
    是不可能的。 
    锁只能被一个用户保持,这是规矩 
    当然这都是oracle 内部机制,如果多线程调用并非完全相同的内容,锁的竞争不是那么明显当然能够提升处理速度的。
      

  7.   

    还有一个问题,我们在进行insert update delete时,椐我所查到的资料所说这些操作会自动取得行级锁,我想问清楚一下,如果我同时由两台机子对一个表进行第一台执行:update from table_name set name = 'name*' 与 第二台执行:update from table_name set age = '50' 比如此表记录有一万条(只是为了说明需求一些时间才能在独立执行某个语句时,时间也要很长),那我想问一下,这两条怎么运行?交叉运行还是,先运行某条完成后,再运行另一条.