关于提交订单的一些问题,大家是怎么处理的?
订单系统(个人分析如下)
1.填写订单信息
2.确认订单信息(显示订单信息,未插入数据库)
3.提交订单(将数据插入数据库)----------------------------生成订单
4.再次显示订单信息(显示未支付,立即支付)----------------订单状态:未支付
5.支付订单(跳转到个支付接口进行支付)
6.修改订单状态(若支付成功)------------------------------订单状态:已支付,等待卖家发货
7.等待卖家发货
8.等待买家收货 -----------------------------------------订单状态:已发货,等待买家收货
9.买家收货 ---------------------------------------------订单状态:已收货,等待买家确认
10.买家确定收货——交易完成 ----------------------------订单状态:买家确认收货,交易完成疑问:
1.当买家填写订单信息后,怎么把填写好的订单信息提交到确认订单信息页面?
我的思路:A.将信息保存到session中,
B.通过post方式提交到确认订单信息页面,
C.把填写好的订单信息插入数据库的临时表。
那种方式比较好呢?
2.向数据库插入数据时,是如何插入的?
数据库表设计:订单表(Order),订单子项表(OrderItem)
我的思路:A.向Order表插入订单信息,返回订单的ID,
B.循环将OrderItem+上订单ID插入OrderItem表中。
问题:如若是这样处理,如何保证事务的一致性,即如何保证向订单子项表插入数据发生错误时,回滚刚刚提交的订单
这种情况怎么处理?

解决方案 »

  1.   

    2.向数据库插入数据时,是如何插入的?
    数据库表设计:订单表(Order),订单子项商品表(OrderItem)插入时事务处理一下就OK
      

  2.   

    1.这个确认订单信息的页面意义大吗?能否直接在提交的时候就提示“是否确认订单信息”?
      如果是必须的话,建议用 server.Transfer() 这样就能获取到上一个页面的表单信息,但是url地址是不改变的,比较适合你这个需求。
    2.插入订单表和插入订单子项表的操作 放到一个存储过程里,然后设置一下事务回滚,这样插入出错时,会自动回滚之前的Insert操作。         --设置事务自动回滚
    set xact_abort on 

    --设置事务开始
    begin transaction
               //ToDo
            commit transaction
      

  3.   

    1.不插入数据库的话,放在SESSION里是可以
    2.害怕数据出错的问题,回滚可以解决的。再不行就 当用户输入好点提交,这是就把数据插入数据库,在跳转到1个类似确认表单的页面,从数据库里把这个用户的这的订单取出来显示,下方显示按钮“是否确认此订单”
    做双重确认。  用户确认后,把数据库的这张订单状态改为true
      

  4.   

    /// <summary>
            /// 执行多条SQL语句,实现数据库事务。
            /// </summary>
            /// <param name="SQLStringList">SQL语句的哈希表(key为sql语句,value是该语句的SqlParameter[])</param>
            public static void ExecuteSqlTran(Hashtable SQLStringList)
            {
                using (SqlConnection conn = new SqlConnection(connectionString))
                {
                    conn.Open();
                    using (SqlTransaction trans = conn.BeginTransaction())
                    {
                        SqlCommand cmd = new SqlCommand();
                        try
                        {
                            //循环
                            foreach (DictionaryEntry myDE in SQLStringList)
                            {
                                string cmdText = myDE.Key.ToString();
                                SqlParameter[] cmdParms = (SqlParameter[])myDE.Value;
                                PrepareCommand(cmd, conn, trans, cmdText, cmdParms);
                                int val = cmd.ExecuteNonQuery();
                                cmd.Parameters.Clear();
                            }
                            trans.Commit();
                        }
                        catch
                        {
                            trans.Rollback();
                            throw;
                        }
                    }
                }
            }
    可以使用这个方法提交多条语句的事务
      

  5.   

    asp.net的现状是,服务程序经常重启。而且整个web服务也是如此,非常多的人都能够在设计web程序时习惯于基于“无状态”的服务方式来考虑web程序的设计,即假设服务器随时重启了(可能需要几秒钟),或者web服务器随时被负载均衡了,应用程序的状态数据都不会丢失。对于asp.net应用程序来说,就是你一开始设计程序时就应该明白Session集合里边的数据时随时会丢失的,你的程序应该不受任何影响。至于第二点,能不能在插入多条记录时保证数据库是有事务处理的,纯粹是数据库操作的基本知识,不谈了。除非你在实际工作中使用了一种根本不支持事务的“数据库”。
      

  6.   

    借用一下#8楼的代码,但是你完全可以写的简洁一些,可以写:            using (DbConnection conn = new SqlConnection(connectionString))
                {
                    conn.Open();
                    DbTransaction trans = conn.BeginTransaction();
                    DbCommand cmd = conn.CreateCommand();
                    cmd.Transaction = trans;
                    使用cmd修改其CommandText和Parameters
    属性提交订单
                      foreach (你的订单明细)
                    {
                        使用cmd修改其CommandText和Parameters
    属性提交订单明细
                    }
                    trans.Commit();
                    }
                }这就足够了。如果有异常抛出,在conn与数据库的当前会话结束时,数据库系统自然就回滚了事务。
      

  7.   

    using (DbConnection conn = new SqlConnection(connectionString))
    {
         conn.Open();
         DbTransaction trans = conn.BeginTransaction();
         DbCommand cmd = conn.CreateCommand();
         cmd.Transaction = trans;
         使用cmd修改其CommandText和Parameters属性提交订单
         foreach (你的订单明细)
         {
            使用cmd修改其CommandText和Parameters属性提交订单明细
         }
         trans.Commit();
    }另外很明显,写ADO.NET代码要尽量使用System.Data.Common命名空间的那些。
      

  8.   

    1.session貌似有大小限制,但是应该足够存储你的信息了吧阿,有的人喜欢把重量压在客户端,有的人喜欢压在服务器端,我比较喜欢存客户端。
    2.用事务管理关联操作比较好。
      

  9.   

    Session是存在服务器端的第一个问题还有没有好的办法呀