关于提交订单的一些问题,大家是怎么处理的?
订单系统(个人分析如下)
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.确认订单信息(显示订单信息,未插入数据库)
3.提交订单(将数据插入数据库)----------------------------生成订单
4.再次显示订单信息(显示未支付,立即支付)----------------订单状态:未支付
5.支付订单(跳转到个支付接口进行支付)
6.修改订单状态(若支付成功)------------------------------订单状态:已支付,等待卖家发货
7.等待卖家发货
8.等待买家收货 -----------------------------------------订单状态:已发货,等待买家收货
9.买家收货 ---------------------------------------------订单状态:已收货,等待买家确认
10.买家确定收货——交易完成 ----------------------------订单状态:买家确认收货,交易完成疑问:
1.当买家填写订单信息后,怎么把填写好的订单信息提交到确认订单信息页面?
我的思路:A.将信息保存到session中,
B.通过post方式提交到确认订单信息页面,
C.把填写好的订单信息插入数据库的临时表。
那种方式比较好呢?
2.向数据库插入数据时,是如何插入的?
数据库表设计:订单表(Order),订单子项表(OrderItem)
我的思路:A.向Order表插入订单信息,返回订单的ID,
B.循环将OrderItem+上订单ID插入OrderItem表中。
问题:如若是这样处理,如何保证事务的一致性,即如何保证向订单子项表插入数据发生错误时,回滚刚刚提交的订单
这种情况怎么处理?
数据库表设计:订单表(Order),订单子项商品表(OrderItem)插入时事务处理一下就OK
如果是必须的话,建议用 server.Transfer() 这样就能获取到上一个页面的表单信息,但是url地址是不改变的,比较适合你这个需求。
2.插入订单表和插入订单子项表的操作 放到一个存储过程里,然后设置一下事务回滚,这样插入出错时,会自动回滚之前的Insert操作。 --设置事务自动回滚
set xact_abort on
--设置事务开始
begin transaction
//ToDo
commit transaction
2.害怕数据出错的问题,回滚可以解决的。再不行就 当用户输入好点提交,这是就把数据插入数据库,在跳转到1个类似确认表单的页面,从数据库里把这个用户的这的订单取出来显示,下方显示按钮“是否确认此订单”
做双重确认。 用户确认后,把数据库的这张订单状态改为true
/// 执行多条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;
}
}
}
}
可以使用这个方法提交多条语句的事务
{
conn.Open();
DbTransaction trans = conn.BeginTransaction();
DbCommand cmd = conn.CreateCommand();
cmd.Transaction = trans;
使用cmd修改其CommandText和Parameters
属性提交订单
foreach (你的订单明细)
{
使用cmd修改其CommandText和Parameters
属性提交订单明细
}
trans.Commit();
}
}这就足够了。如果有异常抛出,在conn与数据库的当前会话结束时,数据库系统自然就回滚了事务。
{
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命名空间的那些。
2.用事务管理关联操作比较好。