我在C#代码里使用多个线程向一个表中插入数据,插入的ID用sequence自动生成,有没有什么办法可以让一个线程用完这个序列后再转让给另一个线程使用?主要针对sequence,不在C#代码里用锁!就是说在oracle中可不可以在有人使用这个序列的时候给一个标记不让别人使用?oracle

解决方案 »

  1.   

    不需要,sequence在多线程调用时依然可以保证产生的值唯一。如果是想让生成的值连续,才需要用程序自行实现。
      

  2.   

    oracle的sequence总是在数据库中生成唯一值,即使当多个用户并发地引用同一sequence时也没有可察觉的等待或锁定。当多个用户使用 NEXTVAL 来增长序列时,每个用户生成一个其他用户不可见的唯一值。当多个用户并发地增加同一序列时,每个用户看到的值是有差异的。例如,一个用户可能从一个序列生成一组值,如 1,3,5和 6,而另一个用户并发地从同一序列生成值2,4,7和8。希望对你有帮助...
      

  3.   

    我是有两张主外键关系的表,我是想在主表插入数据后,再在从表里插入数据!如果只是执行这俩句的话,sequence的唯一到没事!我是考虑到假如有两个地方都在使用这个序列来向这俩张表里插入数据!我的sequence在向从表里插入数据的时候不就乱了吗?
      

  4.   

    非要这样的话可以做两个sequence,把他们的范围错开
      

  5.   

    我是有两张主外键关系的表,我是想在主表插入数据后,再在从表里插入数据!如果只是执行这俩句的话,sequence的唯一到没事!我是考虑到假如有两个地方都在使用这个序列来向这俩张表里插入数据!我的sequence在向从表里插入数据的时候不就乱了吗?oracle 的sequence本来就不能保证连续性:
    1.设置了cache,然后由于某种原因缓存清空了,事先产生的序列号就不见了。
    2.insert 一个sequence 10 然后rollback了,这个序列号也不见了,下一个序列号是11。要想产生连续的序列号,
    1.当然也不能保证2.自己创建序列
      

  6.   

    我是有两张主外键关系的表,我是想在主表插入数据后,再在从表里插入数据!如果只是执行这俩句的话,sequence的唯一到没事!我是考虑到假如有两个地方都在使用这个序列来向这俩张表里插入数据!我的sequence在向从表里插入数据的时候不就乱了吗?oracle 的sequence本来就不能保证连续性:
    1.设置了cache,然后由于某种原因缓存清空了,事先产生的序列号就不见了。
    2.insert 一个sequence 10 然后rollback了,这个序列号也不见了,下一个序列号是11。要想产生连续的序列号,
    1.当然也不能保证2.自己创建序列
    建个triger自己来控制自增