客户端程序只在一台机器上会出现锁数据库的问题,而在其他的机器上从来就没发生过。程序中没有显示编写有关数据库加锁的代码。数据库系统是SQL2000

解决方案 »

  1.   

    数据库锁的问题,比较常见,但象 gardenyang(太阳雨)说的因为机器慢导致的锁定很少见,在SQLServer2000中出现的几率很小,因为所谓的抢占资源,其实DBMS现在已经可以很好的处理。
    但有几点需要注意,如果你自己进行事务锁,则一定要记着及时对锁进行释放。如要从表中的一个字段进行取最大值加一做为下行主键的问题,你要启动自己的事务,在这各事务中进行最大值的锁定操作,取出最大值后马上进行提交。在这个事务中建议你不要有提示信息等功能,设想以下如果用户离开的话,消息框一直没有关闭,就会导致表的一直锁定。
    另外这中情况的锁类型应该为(TabLockX),而holdLock按意思也是一直锁定直到事物结束单经测试有时会过早的释放。
    最后就是对锁定的处理:
    通过企业管理器的管理下的活动可以查看当前的活动用户和锁,你可以查看属性是因为什么数据库要锁定记录,特别是那种死锁一定要处理,对表锁也要特别注意,而页锁的处理要看数据的访问率,不过一般情况下,DBMS可以很好的处理。
    写了这麽多,如果有其他的,请大家会帖
      

  2.   

    通过企业管理器查看
    锁定的进程的上一条TSQL是SELECT .....
    简单SELECT为什么会锁定表
      

  3.   

    把SQL语句写全,还有,你用的是ADO还是BDE,这条SQL语句的数据量有多大?
      

  4.   

    BDE目前数据量还不大
    表里面就上千条吧企业管理器查看到的SQL也不完整,就是SELECT 字段列表[由二十多个字段]
    可能是从我程序中的SELECT * FROM 表名得到的
      

  5.   

    注意BDE用的是客户端游标,当数据量大时,它不会一下子将数据全部从服务器上取回来,因此服务器上将会占用资源。请在你的QUERY。OPEN后加上LAST;FIRST将数据全部取回来。(我曾经碰到过,它会造成阻塞,而且不是死锁,很麻痹人的)
      

  6.   

    注意BDE用的是客户端游标->可能说错了,呵呵,请见谅!
      

  7.   

    请详细描述问题。比如作什么操作的时候会发生锁,锁是的类型是什么等等
    你的问题好像是:我写的程序没有对数据库的显示加锁操作,但是在一台特定的机器执行会出现数据库会被锁定,为什么?
    这样的问题怎么回答?另外提供一些常识:
    数据库是否加锁与数据库设置的隔离等级相关,如果隔离等级设的高,则哪怕是select也会加锁。因此排除数据库锁的问题应当首先 检查锁的类型,检查造成锁的程序代码,检查数据库的设置,别着急,找到问题后,一切就简单了
      

  8.   

    不是我不愿意把代码贴出来
    只是一些Edit,Post,Insert,Open之类的操作
    罗列出来可能大家看的头痛因为只有那一台机器会发生这种情况,所以还没确定到底那个过程的代码引起的!另外请问 tomyang(tomyang)怎样设置数据库的隔离等级
      

  9.   

    TDatabase.TransIsolation的属性设置的是
    tiReadCommitted
      

  10.   

    数据库的隔离级别取决于DBMS,很多你在Delphi中设置的是无效的