我想你碰到的问题和我的一样,这种问题不但在SQL Server
上存在,同出一宗的Sybase也一样有这个问题。产生这种阻
塞问题的原因要从SQL Server的Cursor和锁机制说起:
对于记录数目较多的查询或TTable(在Delphi中TTable也是
一种查询)由于效率原因,SQL Server并不能够一次返回所有
的记录给Delphi, 而是打开了一个Cursor,对数据库遍历。
在不能够一次返回所有记录的情况下,SQL Server放了一个
共享锁在Table上。然而毛病就出在这里,SQL Server的锁机
制是页锁,一次将整整一页的记录同时锁住(这也是SQL Server
效率比Interbase和Oracle等高的原因,但同时在并发度上带来
了巨大的影响),这样但其他进程甚至当前进程本身需要修改
这一页的记录情况下,就不能够顺利实现,而产生了阻塞现象。
为了解决这个问题,我在Internet上花了不少时间,可惜还是
没有真正的答案,只能够给你提供以下一些提示:
1.绝对不要用TTable
2.将TQuery的查询结果局限在一个较小的范围以内,或着在
Query的Select后加上NOLOCK,避免产生锁,另外用一个
Query进行修改。
3.或者在TQuery打开以后,使用FetchAll将所有记录取回本地。
4.放弃SQL Server,而采用Oracle, DB2, Interbase等采取行
级锁机制的DBMS。
没了。