Adoconnection连接MS SQL Server2000数据库,有一段程序代码如下:  Adoconnection.beginTrans;
  ...(表记录增删命令)
  try
    Adoconnection.comitTrans;
  except 
    Adoconnection.RollbackTrans;
    Showmessage('提交事务出错');
  end
    当多个用户连接运行这个程序时,有时会出现“事务(进程 ID 68)与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。”的错误,程序下面的代码就被中止,也就是Adoconnection没有回滚事务,也没有运行下面的Showmessage('提交事务出错')这一行。
    请问大家,当出现上面的错误时如何能够回滚事务,并继续运行下面的代码?

解决方案 »

  1.   

    http://www.fengshenmu.com/it/html/200661526369.htm
    请参考可以解决
      

  2.   

    不是说查找死锁原因,而是让DELPHI如何捕获错误,并回滚事务。
      

  3.   

    你的意思是程序运行的时候,如果出现死锁这个异常情况,没有弹出 Showmessage('提交事务出错');,而且事务也没有回滚?
      

  4.   

    查了下资料,当数据库发生锁的时候,数据库会自动回滚.
    这里提点建议:
    1,你这样处理,根据你提供的信息,你的并发事务很容易引起死锁,建议对锁进行操作或者对程序进行优化处理
    2,http://walkdan.cnblogs.com/archive/2006/01/19/320401.aspx对于你为什么不执行到下一步,不清楚
      

  5.   

    是的,程序没有继续运行except下面的代码,而Adoconnection就一直处于beginTrans状态
      

  6.   

    应该是这样来的吧:
      Adoconnection.beginTrans;
      try
         ...(表记录增删命令)
        Adoconnection.comitTrans;
      except 
        Adoconnection.RollbackTrans;
        Showmessage('提交事务出错');
      end
    这样才会执行except后的代码。
      

  7.   

    同意楼上的观点。一般beginTrans后,SQL Server已经进入事务状态,此时出现任何的错误都会引起“事务”问题。应该把所有可能引起错误的代码放到try块中,这样才可能引起RollbackTrans被调用。另外,为了防止死锁,对多线程访问的代码部分采用线程包含的方法