C#事务的问题,SqlTransaction 的对象,可以夸方法传递吗
SqlConnection con = new SqlConnection(CommonERP.sqlConStr);
//连接
con.Open();
//实例化事务
SqlTransaction myst = con.BeginTransaction();
try
{
//保存主表数据
int mainResult = DAL.po_purchaseOrder.addPurchaseOrder(myst, obj);
if (mainResult <= 0)
{
myst.Rollback();
con.Close();
}
//循环保存子表数据
for (int i = 0; i < rowAdd.Length; i++)
{
//项次加1
string no = "0" + (maxNo += 1).ToString();
//构造正确项次
no = no.Substring(no.Length - 2);
//项次赋值
rowAdd[i]["poOrderItemNo"] = no;
int itemResult = DAL.po_purchaseOrder.addItem(myst, rowAdd[i], obj.PoOrderNo);
if (itemResult <= 0)
{
myst.Rollback();
con.Close();
return false;
}
}
//提交事务
myst.Commit();
//关闭连接
con.Close();
//返回值
return true;
}
catch
{
myst.Rollback();
con.Close();
return false;
}
这个应该是提交子表的数据吧?
这种方法不可取,应该一次性和主表一起提交,要么全部成功,要么全失败。
[解决办法]
只要是对象都可以到处传递。
事务不存在“部分成功”一说,要么全部,要么全不。所以不存在“主表成功,子表失败”一说。
[解决办法]
楼主对事物驱动模式看来还不是非常了解,你的操作链(主表和子表操作)都是在一个事物中提交,当然是全部成功,或者全部回滚。这还有什么疑问可发?
[解决办法]
明显可以的,
你的事物对象是指向同一个引用的
[解决办法]
楼主的写法是可以的.不过这几句是有问题的.
if (mainResult <= 0)
{
myst.Rollback();
con.Close();
}
if (itemResult <= 0)
{
myst.Rollback();
con.Close();
return false;
}
这两个判断是多余的.去掉.
因为只有事务提交后才会有返回结果.
[解决办法]
这个是可以的啊,循环还了再提交事务嘛,出错了就回滚嘛,不过你第一个回滚没有意义,因为mainResult=0,本身就没有写入数据库,第二个回滚和最后一次出错了回滚同理。