首先我自己说一点体会:
在客户端PowerBuilder程序中有语句:
if dw_1.update()=1 then
   messagebox()
   commit ;
end if
和下面的语句进行比较:
if dw_1.update()=1 then
   commit ;
   messagebox()
end if
在update后事务已经开始,先提交后提示和先提示后提交是有区别的。

解决方案 »

  1.   

    sybase经常死锁!真是太差了!
      

  2.   

    可跟MS SQLServer相比,强多了! 
      

  3.   

    1:
    一般这样用UPDATE()
    if  dw_1.update(true,false)=1 then
      ...
    else
      ...
    end if2:
    sybase的触发器不是非常的稳定
     我以前就遇到过,一个INSERT触发器,系统运行一段时间(3-4个月)后,变成了任意
    时机都触发的怪物('for insert'丢了重新生成也不行,怪事)
    )
      

  4.   

    锁的性能与SYBASE SQLServer的配置有多大关系?
      

  5.   

    多看书,锁的取得和释放完全可以在程序里控制,锁不代表死机,而是跟数据的安全分不开的。
    messagebox实际是个使程序停止的窗口,不按其上面的按钮程序就不继续,数据没有提交,事务没有完成,库当然要暂时锁住,所以messagebox要放在commit的后面。
    一个程序同时运行在多台机器上时,必须考虑人为在程序中设置读锁或写锁,因为有的人开开程序就忙别的去了,从而导致或者打开的数据别人在别的机器上就修改不了,或者别人修改的数据在这个人的屏幕上就不能体现,这就要加上定时刷新的功能,并合理选择锁的方式。
      

  6.   

    sybase SQL server 数据库没用过我用的是 MS SQL server 刚开始上系统时经时死锁后来只好一步一步解决网络不是非常大, 有三十台机子同时操作,解决死锁的整个体会是
    1、事务不能太大尽量缩微短事务,一个大的事务最好分几次提交。
    2、要选择合适的index,尽量减少表扫描,但index 不能太多否则影响insert和update 操作。(保持index的最佳选取)
    3、利用存储过程。
    4、建立临时表。
    5、对一个大表(公共表)一次性insert,或update几千行数据时一定要减少插入或更新的字段数。并减少这种操作。
      

  7.   

    zxszx(zxs)的说服有些道理了,但我回复:
    1、2基本这样,
    4不太现实,但也没有什么体会。
    3反而增加了服务器负担,也增加了死锁的可能性,应该把尽量多的事情移到客户端。
    5好象不对,SYBASE数据行的改变是先删除后添加,因此字段树多少应该没有关系,我认为应该
    把多行记录分多次提交,但没有做过。
      

  8.   

    我觉得各位所说的均为锁的争用问题,这正是数据库的基本功能。真正产生死锁是两个应用程序使用相同的资源时,处理逻辑顺序不一致而产生。例如下:
    Transaction1:
    If update table1 success
    Then
        update table2
    End  if
    Transaction2:
    If update table2 success
    Then
        update table1
    End  if
    这种情况在多客户机时,非常容易产生死锁,这在任何数据库系统均是一样的。
    而MessageBox放在Commit,Rollback之前或之后,很显然应放在MessageBox之前,因为放在后面,事务处理不应该由操作员控制。很经典的例子,放在前面,用户做出选择之前,出去了一个小时,其他用户怎么办?
      

  9.   

    wwsccd(蜀中杰利)的例子是对两个表修改,但如果是10个用户在不同的客户机上操作同一个表,
    他们有可能同时提交数据或同时都不提交数据。