关于数据库死锁的问题(300分)

  • 主题发起人 主题发起人 tczxm
  • 开始时间 开始时间
T

tczxm

Unregistered / Unconfirmed
GUEST, unregistred user!
数据库:SYBASE
编程工具:DELPHI
我单位同五个银行进行联网,通过前置机和银行进行通讯
在每个前置机上都有一个交易处理程序,此程序对数据库中的TRADE表进行频繁select操作,
而另外有不少工作站,在工作中需要对客户进行即时的扣款操作,此操作中包含提交扣款交易
向TRADE表INSERT一条记录,然后等待交易结果(也是对TRADE表进行select操作)
在这些操作过程中,经常出现死锁现象,请高手指点
 
高手,求救
 
你先确定 是死锁还是阻塞 解决方法是不一样的
 
确定是LOCK
 
什么意思
 
好像和BDE有关
 
to tseng
能说说清楚吗
 
前置机就不应该操作数据库.
 
小猪,
似乎,您也作过类似的东西,能说说吗
 
这是王寒松大虾教的,给你作参考:
SYBASE 的共享锁 也是有区别的。 默认情况下如果你的客户端读取了10条记录
每条记录的大小 是1K自己。 那么10条就是10K
而SYBASE 的默认的页面大小好像是2K. 也就是说你的客户端选取的数据跨了5页
所以SYBASE就锁住这5页, 不允许其他的更新锁 更新这5页的内容。
如果一个查询对所查表的锁定的页面太多。 就会引发页锁升级为表级锁的行为
这时候整表被锁。 其他的更新过程要等到这个使用查询的客户端 CLOSE掉他的查询
才能继续更新。 这时候就死锁了.

解决的办法: 1: 使用脏读方式。 默认的情况下, 一个TQUERY是使用一个事务去访问
SERVER的, 即使你不指定这个QUEYR的DATABASE是谁, DELPHI也会默认创建一个去连接
SERVER,而这个默认的DATABASE用的是 READCOMMIT 而不是脏读。
所以需要对QUERY指定一个TDATABASE,这个DATABASE使用 DIRTYREAD方式去连接SERVER
要么你就在 Tquery的SQL里用 NOLOCK语句 select * from dbo.xx (nolock)
这时候SERVER上会按脏读方式启动查询事务.
2.重新规划设计. 经常被查询又很少被更新的小表即使发生了表级锁定也不会引起
与其他更新锁发生冲突。 经常被查询和更新的大表尽量使用脏读方式去查询
注意存储过程的用法
涉及到更新的存储过程 example:
create procedure Aaa
select xx,yy,zz,ee,ff from dbo.table_A
if ???
update dbo.table_A where xx=???
..........
select xx,yy,zz,ee,ff from dbo.table_A
上面这个存储过程如果单独运行没问题,如果在并发环境里运行
那么最后一句就要小心了. 由于过程中发生了更新动作, 整个存储过程的
级别会被提升到 更新级的锁定。 而存储过程的最后却返回了 表A的内容
这个时候如果其他用户运行此过程就会发生死锁

 
to forgot2002
我的情况是,
前台不少客户机提交操作交易,向TRADE表插入一条等待交易的记录,然后启动等待程序,
即循环的SELECT表TRADE,查询交易成功的记录,
而与此同时
五台前置机并发的在对TRADE表进行SELECT操作,查询到符合条件的记录,
则发送至远端服务器进行处理,处理完毕UPDATE相应的标志位,

对SYBASE数据库我也进行了必要的优化,在前置机上的SELECT操作我也优化为
select * from trade at isolation read uncommitted

但是还不能解决,请再指点
 
后退
顶部