死锁问题
三层结构,数据库采用MS-SQL,应用端和客户端delphi6开发
当客户端有五个人以上在操作时(只有查询和修改两个动作),经常会保存失败,
数据库才两万多条记录.
当出现保存失败的时候在查询分析器里运行简单的一个查询(只查一条记录),
则会出现1205的错误.
检查数据库服务器的CPU运行正常,内存也正常,程序中控制一条记录不同时被两个用户读取。
可否通过设置SQL来减少死锁情况的发生.
问题点数:20、回复次数:4Top
1 楼hdhai9451(☆新人类☆)回复于 2005-01-09 11:06:18 得分 5
exec sp_lockTop
2 楼huangweizhao(小菜鸟)回复于 2005-01-09 11:07:19 得分 0
应该可以,sql server有串行化功能。Top
3 楼stweiguo(真水先生)回复于 2005-01-09 13:02:26 得分 0
set_locktimeout set 1000
试过多个时间,不是很理想Top
4 楼mschen(Co-ok)回复于 2005-01-09 13:21:40 得分 15
可能是你的事务隔离级别设置的太高了或者是应用程序对表的访问有些不合理导致了死锁的发生.
如何来避免死锁的发生.
(1)合理安排表访问顺序。
(2)在事务中尽量避免用户干预,尽量使一个事务处理的任务少些, 保持事务简短并在一个批处理中。
(3)数据访问时域离散法, 数据访问时域离散法是指在客户机/服务器结构中,采取各种控制手段控制对数据库或数据库中的对象访问时间段。主要通过以下方式实现: 合理安排后台事务的执行时间,采用工作流对后台事务进行统一管理。工作流在管理任务时,一方面限制同一类任务的线程数(往往限制为1个),防止资源过多占用; 另一方面合理安排不同任务执行时序、时间,尽量避免多个后台任务同时执行,另外, 避免在前台交易高峰时间运行后台任务。
(4)数据存储空间离散法。数据存储空间离散法是指采取各种手段,将逻辑上在一个表中的数据分散到若干离散的空间上去,以便改善对表的访问性能。主要通过以下方法实现: 第一,将大表按行或列分解为若干小表; 第二,按不同的用户群分解。
(5)使用尽可能低的隔离性级别。隔离性级别是指为保证数据库数据的完整性和一致性而使多用户事务隔离的程度,SQL92定义了4种隔离性级别:未提交读、提交读、可重复读和可串行。如果选择过高的隔离性级别,如可串行,虽然系统可以因实现更好隔离性而更大程度上保证数据的完整性和一致性,但各事务间冲突而死锁的机会大大增加,大大影响了系统性能。
(6)使用绑定连接, 绑定连接允许两个或多个事务连接共享事务和锁,而且任何一个事务连接要申请锁如同另外一个事务要申请锁一样,因此可以允许这些事务共享数据而不会有加锁的冲突。Top




