有多个任务访问  表A(日志表) 查询,如果有数据就执行 插入表B的操作,然后删除表A的数据。发现表B经常有时间重复数据。并发导致。(是在一个任务插入表B的过程中还没有来得及删除表A数据时,另外一个任务又执行了,或同时执行)。下列解决方法是否可行?
在表A加一个字段lx,当任务查询表A中lx<>'T' 的数据,如果有数据时,先把lx字段修改为T,然后在执行插入表B操作,再删除表A数据。 
多个任务会同时查询数据吗?还是按队列查询的。如果同时查询 就没办法解决了吧网上说可以加行级锁,能说说吗?

解决方案 »

  1.   

    查询表A的时候加for update nowait(select ..from A for update nowait),这样如果多个事务如果同时访问表A的同一条记录时先到达的那个事务是正常的,其他事务就会返回错误,如果是for update,其他事务就会一直等待第一个事务结束,不过你这种情况貌似不太适用,因为如果加了行级锁的话,除非commit或rollback,不然后面的delete操作也不能进行了,如果在delete A之前commit了,其他事务也可以访问A中相同的记录了
      

  2.   

    我觉得你可以使用事务先删除A表的数据
    delete from A where 
    if sql%rowcount >=1 then
    insert B
    如果事务失败就全部回滚
      

  3.   

    你是不是意思是串行insert?
    使用REPEATABLE READ隔离级别