[求助]C#如何写嵌套事务

oktell 2013-03-10 10:00:45
背景:
表:订单表 order
订单分录: orderentry
实现需求:订单表记录的是表头信息,订单分录表记录的是订单的详细信息。分录表与订单表用一个字段关键。order表对应多个分录。

订单表主要字段:订单总金额,订单总数量
订单分录表中字段:分录金额,分录数量,分录单价

当增加一条分录时,订单表中的总金额要自动增加所有分录的金额,所以这需要一个事务。

myConn.Open();
myTrans = myConn.BeginTransaction();

try
{
EPaybill = MPaybill.SelectByID(paybillEntry.FPARENTID); //订单表头记录

MPaybillEntry.Insert(myTrans, paybillEntry); //插入订单分录

EPaybill.FPASSTOTALAMOUNT = this.GetOrderTotalAmount(paybillEntry.FPARENTID); // 获取订单总金额

// 现在的问题是:在此这前事务还没提交,无法获取刚插入的记录,这里是不是需要嵌套事务?

MPaybill.Update(myTrans, EPaybill);

myTrans.Commit();
}
catch (Exception e)
{
bRetVal = false;
strFailedRetMess = Resources.MESSAGE_TRANS_FAILED;
myTrans.Rollback();
}
finally
{
myTrans.Dispose();
myConn.Close();
}

return bRetVal;
}


我的疑问是:后一条更新语句不能获取刚刚插入的记录。有什么办法呢?嵌套事务?不想用分布式事务。
...全文
293 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhongxiaobing 2013-06-20
  • 打赏
  • 举报
回复
引用 12 楼 sp1234 的回复:
小朋友,你的脑子有点被sql语句给烧坏了。你不会是连“给一些int数值排序”这种动作都想用数据库来实现吧?csdn上确实有这种人。 编程以通顺、正确为目的,编程不是什么高尚的职业,软件设计工作和对进度负责才是高尚的职业。你编程时明明拿着数据确找不着数据。作为一个程序设计师(只要你有能力“设计”)那么你可能一辈子也几乎用不着什么“嵌套事务”这种东西。
假如要用到主键呢,而且此时是批处理。。。。
  • 打赏
  • 举报
回复
引用 8 楼 oktell 的回复:
其实,我是为了简化问题的复杂度,才将问题写成这样,其实,实际业务后面还有复杂的业务逻辑计算。这个后面的业务就是需要读取刚刚插入或更新的数据的。 请问大家是怎么做的?
这就是你们的程序架构设计的问题,而不是数据库设计编程那点代码的问题。你钻进“嵌套事务”里这就是被关系数据库给搞晕了。假设你把数据传送给“云”存储,假设这个存储是只能写不能读取的,你也纠结于“嵌套事务”问题吗? 你们的程序的处理流程,后边的流程取不到前边的流程的数据,那么这是简单的程序设计问题。不知道程序的变量应该声明在哪里,不知道后边的代码如何读取前边代码用过的变量(对象),这是需要在学校里多做练习的问题,千万不要搞错问题的概念方向。
  • 打赏
  • 举报
回复
小朋友,你的脑子有点被sql语句给烧坏了。你不会是连“给一些int数值排序”这种动作都想用数据库来实现吧?csdn上确实有这种人。 编程以通顺、正确为目的,编程不是什么高尚的职业,软件设计工作和对进度负责才是高尚的职业。你编程时明明拿着数据确找不着数据。作为一个程序设计师(只要你有能力“设计”)那么你可能一辈子也几乎用不着什么“嵌套事务”这种东西。
  • 打赏
  • 举报
回复
你刚插入的数据不就是 paybillEntry 对象嘛。你拥有刚插入的订单记录和订单分表记录,还要读什么数据库 ?
裸奔的蜗牛 2013-06-01
  • 打赏
  • 举报
回复
看来只能用嵌套性事务了,lz还是不要在DAL中写这些业务的东西,应该分开,在业务中去操作,这样即使以后对订单子项进行扩展(比如优惠活动啊之类的),也不会影响其他部分
oktell 2013-03-12
  • 打赏
  • 举报
回复
引用 7 楼 lye2000000_super 的回复:
这个逻辑那你就别去取合计了。就加一条数据而已。。在原有基础上计算好了设置好然后保存就行了。。。。
其实,我是为了简化问题的复杂度,才将问题写成这样,其实,实际业务后面还有复杂的业务逻辑计算。这个后面的业务就是需要读取刚刚插入或更新的数据的。 请问大家是怎么做的?
  • 打赏
  • 举报
回复
你后面的就可以取到了啊。你已经提交了。 这个跟你这个问题有什么关联吗?
Kilin_Zhang 2013-03-11
  • 打赏
  • 举报
回复
分布式事务有那么恐怖吗? System.Transactions.TransactionScope 这玩意挺好用的啊。
oktell 2013-03-11
  • 打赏
  • 举报
回复
引用 2 楼 KingWheat2010 的回复:
这不就是主从表的操作么? 插入订单分录是否用存储过程操作数据库的? 建议你在存储过程中去实现,每增加一条记录修改下主表的总金额。 单看你这段代码,代码段中不需要用到事务,直接在数据库的存储过程中用吧
不用存储过程或触发器能否实现?
  • 打赏
  • 举报
回复
这个逻辑那你就别去取合计了。就加一条数据而已。。在原有基础上计算好了设置好然后保存就行了。。。。
oktell 2013-03-11
  • 打赏
  • 举报
回复
这个问题的本质,其实是能否读取本事务中未提交的数据。 比如,这个事务有2个操作,前一个操作是插入一条数据,后一个操作是根据前一条插入的数据再执行一个更新。
oktell 2013-03-11
  • 打赏
  • 举报
回复
引用 4 楼 zhang_7150 的回复:
分布式事务有那么恐怖吗? System.Transactions.TransactionScope 这玩意挺好用的啊。
分布式是否需要配置服务器与客户端?如果要配置服务器的话,不太可能,因为我们的生产环境业务非常多,而且是aix操作系统上的。
Nenulae 2013-03-10
  • 打赏
  • 举报
回复
这不就是主从表的操作么? 插入订单分录是否用存储过程操作数据库的? 建议你在存储过程中去实现,每增加一条记录修改下主表的总金额。 单看你这段代码,代码段中不需要用到事务,直接在数据库的存储过程中用吧
gxingmin 2013-03-10
  • 打赏
  • 举报
回复
ADO.NET嵌套SQL事务一例 好像结合存储过程一起使用

110,499

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧