在DELPHI 下编程,如何避免MSSQLSERVER死锁(200分)

  • 主题发起人 主题发起人 okmwq
  • 开始时间 开始时间
O

okmwq

Unregistered / Unconfirmed
GUEST, unregistred user!
在DELPHI 下编程,如何避免MSSQLSERVER死锁,如
死锁,如何解锁.
 
死锁大多数情况是Update锁和其他锁死锁。
如果系统对数据实时性要求不高,可以在Select 后面加Nolock,即允许脏读。
我在一个100多人用的系统里使过,效果非常不错。
 
如果发生死锁,可以用EnterPrise Manager杀死锁的进程。
 
1、尽量少用Table,多用Query;
2、Table用完以后及时Close;
3、SQl Server 的最大进程默认为15个,可以改大!(好象要向MS购买)
................
 
Marlowe 的办法是最有效的. 减少因使用Select查询,而锁定表.

在MS SQL server 中用Nolock , Sybase SQL server 中用 NoHoldLock.

例子:

Select A.AAA, A.BBB from TableA A nolock where BBB > 0
 
SQL SERVER避免死锁的办法
1。使用存储过程,提高存取效率
2。查询不要用 TTABLE, 而是使用QUERY,tTable使用SELECT * 的方式查找数据
容易导致网络流量过大,和SERVER端的锁升级(升级到表锁就惨)
3。 尽量不用DBGIRD 和一些数据敏感性的控件, 这样在查询完后,将查找结果
显示到一些非数据控件里,查询完后立刻关闭QUERY
4, 更新数据的过程使用database的显式事务控制,
try
database1.starttransaction;
...
database1.commit;
except
database1.rollback;
showMessage('error');
end;
这样保证在更新主从表的时候不至于因为更新错误导致 关联不正确

5. 上面提到的事务执行周期要短,如需更新多条数据
最好不要将更新多条放在一个事务里,而应为每条记录的更新
建立一个事务。 缩小事务规模,减小锁定时间

6。 查询使用脏读 NOLOCK选项

Seasky 的SQL 写的有误
Select A.aaa, A.bbb from TableA A (nolock) where bbb>0
nolock 两边该加上括号,否则的话,出现异常

 
可以使用三层结构,由于三层结构使用同一个应用服务器连接数据库,而多个客户
端只是访问同一个应用服务器,应该可以解决死锁问题
 
to Jaylv:
锁与多人有关系,但不是只有多人时才会有锁,
单人一样会有锁, 也就是说即使你用三层结构,一样会在 SERVER端被不同的表
加锁, 单机连的SERVER的时候甚至有自己的程序把自己锁死了的情况。
 
尽可能提高服务器的配置,加强处理能力,缩短事务处理时间,减少冲突发生。
 
将相对独立的问题分成多个数据库设备,安装在不同的服务器上
 
我们当时是使用了MSSQLSERVER的创建中间表的功能,可直接在SQLSERVER上实现,
效果非常明显,希望对你能有帮助。
 
不要长时间占用数据库资源!
 
这位老兄怎么还不来分配分数哦

你的问题:
>在DELPHI 下编程,如何避免MSSQLSERVER死锁,如
>死锁,如何解锁.

避免死锁说过了, 解锁嘛,呵呵, MS SQL SERVER在处理死锁
时会自动断开其中的一个,同时给被断开的一方发出1205错误信息

 
这问题讨论许多次了,没有新鲜的了
请继续讨论或结束问题
 
多人接受答案了。
 
后退
顶部