举个列子 假如有个会员登陆成功送积分场景
if(login())//登陆成功
{
  ....
  integral() 修改积分
}
后来客户说了送积分关系重大需要日后统计需要日志记录,然后立马写了个日志记录
Insertjournals()日志记录最后形成会这样
if(login())//登陆成功
{
  ....
  if(integral()) 修改积分
  {
    Insertjournals()日志记录
  }
}
积分日志假设是个很重要部分 这样很显然会有问题  我们要求修改积分成功后日志记录也不能有差错
要是日志记录出现错误那么就回滚 这样就想到修改积分和日志记录事务处理来做
 这样问题又来了 .net事物处理一般简单的办法就是在数据层需要事务的方法里修改加上SqlTransaction
假如后期客户有新的要求出来 还需要用的事务处理的话就要不断的修改数据层大家是如何解决事务处理或者替代或者有好点文章推荐学习的 谢谢~

解决方案 »

  1.   

    回滚的是数据库数据,用数据库事务是最好不过,Update和Insert语句应该放在一个数据库事务里,
      

  2.   

    /// <summary>
            /// 带事务的批量操作数据。
            /// </summary>
            /// <param name="sqlInsert">SQL</param>
            /// <returns>操作是否成功</returns>
            public static bool OperateDatasWithTransaction(List<string> sqlList)
            {
                SqlConnection myConnection = new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["ConnStr"]);
                myConnection.Open();
                SqlCommand myCommand = myConnection.CreateCommand();
                SqlTransaction myTrans;
                // Start a local transaction
                myTrans = myConnection.BeginTransaction(IsolationLevel.ReadCommitted);
                // Assign transaction object for a pending local transaction
                myCommand.Connection = myConnection;
                myCommand.Transaction = myTrans;
                try
                {
                    foreach (string item in sqlList)
                    {
                        myCommand.CommandText = item;
                        myCommand.ExecuteNonQuery();
                    }
                    myTrans.Commit();
                    return true;
                }
                catch (Exception)
                {
                    myTrans.Rollback();
                }
                finally
                {
                    myConnection.Close();
                }
                return false;
            }
      

  3.   

    string[] arrId = Ids.Split(',');
                SqlConnection con = null;
                SqlTransaction trans = null;
                try
                {
                    con = new SqlConnection(SqlHelper.ConnStr);
                    con.Open();
                    trans = con.BeginTransaction();                foreach (var id in arrId)
                    {
                        dal.DeleteByID(trans, int.Parse(id));
                    }                trans.Commit();
                    return true;
                }
                catch
                {
                    trans.Rollback();
                    return false;
                }
                finally 
                {
                    trans.Dispose();
                    con.Close();
                }
      

  4.   

    csdn管理菜单鼠标移上去显示层有问题 想加分移到加分地方层就影藏了 难道我IE6问题??