C
chenliang_fly
Unregistered / Unconfirmed
GUEST, unregistred user!
你看看这段文字对你是否有些帮助
来自:delphi 时间:1998-09-27 上午 06:25:08 ID:13582
我想你碰到的问题和我的一样,这种问题不但在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, 而是使用QUERY,tTable使用SELECT * 的方式查找数据容易导致网络流量过大,和SERVER端的锁升级(升级到表锁就惨)
2.将TQuery的查询结果局限在一个较小的范围以内,或者在Query的Select后加上NOLOCK,避免产生锁,另外用一个Query进行修改;
3.或者在TQuery打开以后,使用FetchAll将所有记录取回本地;
4.放弃SQL Server,而采用Oracle, DB2, Interbase等采取行级锁机制的DBMS;
5、使用存储过程,提高存取效率;
6、尽量不用DBGIRD 和一些数据敏感性的控件,这样在查询完后,将查找结果显示到一些非数据控件里,查询完后立刻关闭QUERY;
7、更新数据的过程使用database的显式事务控制:
来自:delphi 时间:1998-09-27 上午 06:25:08 ID:13582
我想你碰到的问题和我的一样,这种问题不但在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, 而是使用QUERY,tTable使用SELECT * 的方式查找数据容易导致网络流量过大,和SERVER端的锁升级(升级到表锁就惨)
2.将TQuery的查询结果局限在一个较小的范围以内,或者在Query的Select后加上NOLOCK,避免产生锁,另外用一个Query进行修改;
3.或者在TQuery打开以后,使用FetchAll将所有记录取回本地;
4.放弃SQL Server,而采用Oracle, DB2, Interbase等采取行级锁机制的DBMS;
5、使用存储过程,提高存取效率;
6、尽量不用DBGIRD 和一些数据敏感性的控件,这样在查询完后,将查找结果显示到一些非数据控件里,查询完后立刻关闭QUERY;
7、更新数据的过程使用database的显式事务控制: