数据库程序中有两个DB接口,都对同一个表完成更新操作。
1、DBDelEndedCurrByHisAlarm ----对同一个表利用SQL语句完成删除操作
2、DBAddEndedCurAlarm-----------利用bcp的接口完成数据插入
冲突很频繁,请帮忙解决。
 
这两个接口在两个线程中调用,而且调用非常频繁。
==========================================================
其中DBAddEndedCurAlarm采用了bcp的方式,可能和冲突有关,我猜测bcp方式一定是表锁定或者DB锁定的方式。该怎么解决这个问题?

解决方案 »

  1.   

    bcp加的意向共享,然后顺序的加载page,加共享锁
    应该是和delete一点不冲突
      

  2.   

    查了资料好像是说bcp默认采用表锁tablock的方式,也就是他执行插入数据时,就对当前表加锁,其他线程再对该表做操作时,也是无法执行的吧?
    bcp插入数据时采用的是互斥锁的方式?如何在bcp中加入共享锁呢? 
      

  3.   


    sorry 以为是bcp导出了
      

  4.   


    2005导入是意向的排他锁,页面级可能是直接分配一个单元,一般的操作可能都要等bcp结束后,才能执行
    分的都是新页,和delete应该不冲突吧
      

  5.   

    BCP 插入数据的时候使用的是 X 锁(或 BU 锁),防止插入的数据在 BCP 完成前被修改。只是可以通过设置修改锁的颗粒度——行锁或表锁。
    sp_tableoption 'tabname', 'table lock on bulk load', 0 使用行 X 锁
    sp_tableoption 'tabname', 'table lock on bulk load', 1 使用表 BU 锁
      

  6.   

    BCP插入数据是用SQLSERVER2000提供的接口完成的。
    该怎么在程序中将该锁粒度改小一点呢?
      

  7.   

    调用 bcp_control (HDBC hdbc, INT eOption, void* iValue) 函数。
      

  8.   

    xman_78tom你好,你的是sqlserver200几?出的是x锁?
      

  9.   


    -- SQL Server 2008
    -- 为了方便测试使用 bulk insert 语句执行批量插入
    begin tran
     bulk insert tabname from filename
    --rollback tran
    -- 使用下面语句,观察到在 bulk insert 期间有 X 锁在 rid 和 page 上,表上为 IX 锁
    select resource_type,db_name(resource_database_id),resource_description,request_mode
    from sys.dm_tran_locks where resource_database_id=DB_ID('tabname') 
    -- 如果使用 tablock,则会观察到表上有 UB 锁,有大量的 X 锁在 page 和 extent 上
      

  10.   

    理解错了,以为你说是table上是排他了 ...
      

  11.   

    bcp执行的不是从文件往数据库插入数据,而是从内存变量往数据库插入,所以bcp_control函数是不起作用的。到底有什么方法可以在程序中控制锁的粒度?
     
      

  12.   

    BCP到临时表,再从临时表插入,这种方法呢?