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