以下是我为记录中的newid字段赋值并把修改后的记录存入数据库的代码。因为是初学者,对事物处理没什么认识,只是最近才查阅了相关的资料。对于程序中是否能真正实现事物处理还不确定。希望大家帮我看看,指出错误的地方,并且对于事物处理有什么心得能不能跟我分享一下。   
 if not self.ClientDataSet1.IsEmpty then
    begin
      if self.ClientDataSet1.FieldByName('newid').IsNull then
      begin
        if not self.ClientDataSet1.IsEmpty  then
        begin
          Unit2.DataModule2.ADOConnection1.BeginTrans;   //创建事务
          try
          begin
            while not self.ClientDataSet1.eof do      //循环语句
            begin
              self.ClientDataSet1.Edit;
              self.ClientDataSet1.FieldByName('newid').AsString := Edit1.text;
              Self.ClientDataSet1.Post;
              self.ClientDataSet1.Next;  
            end;
          //把数据集中的数据(包括Form4传递进来的数据和上面代码加入的newid数据)写入数据库
          self.clientdataset1.ApplyUpdates(-1);          Unit2.DataModule2.ADOConnection1.CommitTrans;            //提交事务
          end;
          except
            begin
              showmessage('数据插入错误!');
              Unit2.DataModule2.ADOConnection1.RollbackTrans;       //回滚事务
            end;
          end;

解决方案 »

  1.   

    个人认为:开始事务应在循环中,try..except应在post附近使用。其实不是操作多表,用不用事务无所谓。
      

  2.   

    谢谢zzflover。其实,这个关于事务处理的意见是我的老师跟我提的。他说:“你弄的这个程序,是要面对多用户操作,要考虑一下并发操作的问题”。所以,对于程序中的事务处理我还是想弄一弄的,为了进步嘛!
    前辈,对于处理事务的语句是不是要加在SQL语句上(我看其他人的例子都是这么做的),而我的程序中直接给字段赋值,行不行啊?
      

  3.   

    多用户操作,如果只是向数据库插入的话,是不必用锁或者事物管理的,数据库本身已经带了。如果是多用户修改操作,那么加锁是应该的。也就是要用到线程的临界区或者互斥等。关于事务,事务的作用是你在操作多表的时候使用的,比如说,你想在一个procedure中同事操作N个表,有一个表操作不成功,那么事务回滚。这是我的理解,大家互相学习。