这个事务一直成功提交,我第二个删除操作失败返回为0也不回滚,把scope.Complete()代码删除了,也照样成功提交事务。
为什么不回滚? TransactionOptions transactionOption = new TransactionOptions();
            //设置事务隔离级别
            transactionOption.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
            // 设置事务超时时间为60秒
            transactionOption.Timeout = new TimeSpan(0, 0, 60);            using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, transactionOption))
            {
                result = channel.Route_DeletebyRoadId(id);
                if (result > 0)
                {
                    result = channel.Roadbook_Deletebyid(id);
                    if (result > 0)
                    {
                        scope.Complete();
                    }
                }
            }

解决方案 »

  1.   

    参考
    http://topic.csdn.net/u/20080111/16/8574ee34-dd7d-4748-a2e1-a1939d6b93e7.html
    此外,你的这些貌似进行了分层处理
    result = channel.Route_DeletebyRoadId(id);
    result = channel.Roadbook_Deletebyid(id);
    为什么这些数据处理的事务性的东西不放在数据访问部分呢
      

  2.   

    因为你使用了using ,那么出了作用域,事务自动会提交,如果是发生错误则自动回滚。
      

  3.   

    完成事务范围当应用程序完成它要在一个事务中执行的所有工作以后,您应当只调用一次Complete方法,来通知事务管理器它可以提交事务。将对Complete的调用作为using块中的最后一个语句是很好的做法。未能调用此方法时将中止事务,因为事务管理器将此问题解释为系统故障,或者解释为相当于在事务范围内引发了异常。但是,调用此方法并不保证会提交事务。它只是一种将状态通知给事务管理器的方式。调用Complete方法之后,就不能再通过Current属性访问环境事务,尝试这样做将会导致引发异常。如果TransactionScope对象最初创建了事务,则事务管理器会在using块的最后一个代码行后执行实际的提交事务工作。如果该对象未创建事务,则每当CommittableTransaction对象的所有者调用Commit时都会执行提交。届时事务管理器会调用资源管理器,并根据是否对TransactionScope对象调用了Complete方法来通知资源管理器进行提交或回滚。using语句可确保调用TransactionScope对象的Dispose方法,即使发生异常时也是如此。Dispose方法标志着事务范围的结束。在调用此方法之后所发生的异常不会影响事务。此方法还将环境事务还原到其前一状态。如果范围创建事务,则会引发TransactionAbortedException,从而中止事务。如果事务管理器无法做出提交决定,则会引发TransactionIndoubtException。如果已提交事务,则不会引发异常。
      

  4.   

    我在后面加了Dispose()语句,并且断点调试执行了Dispose()结果还是提交了。            TransactionOptions transactionOption = new TransactionOptions();
                //设置事务隔离级别
                transactionOption.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
                // 设置事务超时时间为60秒
                transactionOption.Timeout = new TimeSpan(0, 0, 60);            using (TransactionScope scope = new TransactionScope                  (TransactionScopeOption.Required, transactionOption))
                {
                    result = channel.Route_DeletebyRoadId(id);
                    if (result > 0)
                    {
                        result = channel.Roadbook_Deletebyid(id);
                        if (result > 0)
                        {
                            scope.Complete();
                        }
                        else
                        {
                            scope.Dispose();
                        }
                    }
                }
      

  5.   

    result = channel.Route_DeletebyRoadId(id);与result = channel.Roadbook_Deletebyid(id);是不是开了新的数据库连接?如果是,那就又是一个新的事务了,它会自动提交的。