数据库程序中有两个DB接口,都对同一个表完成更新操作。
1、DBDelEndedCurrByHisAlarm ----对同一个表利用SQL语句完成删除操作
2、DBAddEndedCurAlarm-----------利用bcp的接口完成数据插入
冲突很频繁,请帮忙解决。
这两个接口在两个线程中调用,而且调用非常频繁。
==========================================================
其中DBAddEndedCurAlarm采用了bcp的方式,可能和冲突有关,我猜测bcp方式一定是表锁定或者DB锁定的方式。该怎么解决这个问题?
1、DBDelEndedCurrByHisAlarm ----对同一个表利用SQL语句完成删除操作
2、DBAddEndedCurAlarm-----------利用bcp的接口完成数据插入
冲突很频繁,请帮忙解决。
这两个接口在两个线程中调用,而且调用非常频繁。
==========================================================
其中DBAddEndedCurAlarm采用了bcp的方式,可能和冲突有关,我猜测bcp方式一定是表锁定或者DB锁定的方式。该怎么解决这个问题?
应该是和delete一点不冲突
bcp插入数据时采用的是互斥锁的方式?如何在bcp中加入共享锁呢?
sorry 以为是bcp导出了
2005导入是意向的排他锁,页面级可能是直接分配一个单元,一般的操作可能都要等bcp结束后,才能执行
分的都是新页,和delete应该不冲突吧
sp_tableoption 'tabname', 'table lock on bulk load', 0 使用行 X 锁
sp_tableoption 'tabname', 'table lock on bulk load', 1 使用表 BU 锁
该怎么在程序中将该锁粒度改小一点呢?
-- 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 上