我现在使用一个JOB每隔3分钟执行一个存储过程,用来执行查询和建立临时表,但是,这个存储过程的调用并非并发的,如何上一次调用的查询和建表操作没有结束,要一直等到上一次操作结束(哪怕是过了3分钟)JOB才对该存储过程进行下一次调用,如果我换个方式,同时建立多个JOB,比如三个,每个都是每3分钟执行一次,每个JOB之间相隔1分钟,这样是否可以实现存储过程的并发执行呢?如果要等待上次执行结束才进行下一次调用,效率就太低了。谢谢各位了!

解决方案 »

  1.   

    这个要看你操作的是什么数据?
    如果每隔一分钟执行JOB一次,但如果上次JOB未执行完,下一个JOB又开始了,同一数据可能被两个JOB同时查到,如果进行INSERT INTO操作,可能会插入重复的数据;
      

  2.   

    我没有DML操作,存储过程中全部是select操作,并且我进行了并发控制,不会对同一行数据同时进行操作。
      

  3.   

    以前的公司就出现过Job交叉调用,导致死锁,结果整个DB当掉了.
      

  4.   

    过程在三分钟内肯定没法完成,我最耗时间的一个操作是create table as select * from ,由于数据量过大,而且索引也没建好,所以有时候操作需要几个小时。
    但是,根据我的观察,job的上一次调用如果没有完成,是不会进行下一次调用的。
    这是因为存储过程对同一个表进行了update操作。在update时,该表被锁,要等到commit,这个锁才被释放。
    但是,在update的过程中,我使用了一个标示字段,在操作完成后这个标示字段被update了,所以,存储过程不可能同时对一个表进行插入操作,也不可能同时去update同一行记录。
    我现在想知道,为什么我的存储过程没办法并发执行呢?
    update操作的那个表,在create table as之前就commit了,那个表的锁应该被释放了才对。
      

  5.   

    每3分钟做一次 create table as select * from ..... ???
    为什么不直接使用临时表,只要创建一次就好了, create temporary table xxx .....
    还不需要自己设计表之间的隔离,临时表就已经设置好了session之间的隔离楼主说说具体为什么要这么做,或者到底要做什么吧
      

  6.   

    我的数据需要在临时表中保存一段时间的,比如一年或者一个月,但temporary table在会话结束或者commit后数据就被删除了。