同意bluepower2008(蓝色力量) 兄说的

解决方案 »

  1.   

    首先你好检查一下,你的删除动作是否用上了索引,如果没使用索引,那么当前的删除使用了表排他锁,当然此时就不能再插入数据了;
    如果早期数据在整个表中所占比例超过一定percent,则行锁或页锁也会自动升级为表锁。
    遇到此类问题,你可以修改你的删除数据程序,是它变成一个cursor,这样可以避免出现表级锁。
      

  2.   

    谢谢各位回答:
    小弟刚学SQL不久,很多都不是很理解。
    锁怎么设置呢?
    什么叫是否上了索引?我用min(日期),得到最早日期,这样算是用了索引吗?
    cursor是个什么概念。下面是我的删除操作
    declare @mdf_used real --数据文件已经使用空间
    declare @maxspacerate real --最大百分比设置
    declare @totalspace real --分区最大空间
    declare @mindate datetime --最早一天
    use test_bpcall --打开数据库
    select @mdf_used=FILEPROPERTY('bpcall_Data', 'SpaceUsed')*8 --获得.mdf文件实际使用大小
    select @maxspacerate=databasemaxrate from databasesize --得到最大百分比设置
    select @totalspace=databasetotalsize from databasesize --得到分区最大空间
    select @mindate=min(rqsj) from lsxxk --得到最早日期(天)
    if(@mdf_used/1024)/@totalspace*100>@maxspacerate         --判断当前使用率与最大使用率(纯分区实现)即一个分区只有数据库数据.mdf文件,日志放在其他区。
    --@usespacerate>=maxspacerate --判断使用率,受其他文件影响的分区形式
    begin
    delete from lsxxk where rqsj<(@mindate+1) --删除最早一天数据
    end
      

  3.   

    bluepower2008(蓝色力量)  :
    用事务的方法,如何对上面代码设置锁呢?
      

  4.   

    我用exec sp_lock看到的是个表锁。怎么办
    51 4 0 0 DB                  S GRANT
    52 4 0 0 DB                  S GRANT
    53 10 0 0 DB                  S GRANT
    54 1 85575343 0 TAB                  IS GRANT
    54 10 0 0 DB                  S GRANT
    55 10 0 0 DB                  S GRANT
      

  5.   

    修改这句:delete  from  lsxxk  where  rqsj<(@mindate+1) --删除最早一天数据 ==》delete  from  lsxxk with (ROWLOCK) where  rqsj<(@mindate+1)不过你的这种方法我不推荐,一来数据库中的数据不应该轻易删除,应该作为历史记录保存,数据库的空间大小也应该尽量保证,哪有每次插入新记录都要担心数据库空间不够的道理;二来即使要定期清除过期数据,也最好是做一个定时任务,避开高峰时间来做清除过期数据的工作。直接使用触发器很影响效率。
      

  6.   

    ROWLOCK是行锁吗?
    不过,我的数据库很大,每天要不能间断得收取信息,一天大概200M,总有一天会把硬盘(至少40G)撑满的。我做的是JOB,每天夜里2点触发。很恐怖的数据库啊...加了行锁,那么会影乡数据的同时插入吗?
      

  7.   

    看到各位的发言
    我赶紧翻了翻SQL的工具书
    可上只介绍了下些锁的概念,可没有计如何去设置锁,利用锁
      

  8.   

    我测试过了,还是不行。触发删除JOB的时候,数据不能插入,当把删除JOB停止后,数据就能插入。如何解决啊??