【问题标题】:linq to sql transactionlinq 到 sql 事务
【发布时间】:2013-02-15 07:32:22
【问题描述】:

我在下面的代码中有对存储过程的不同调用。

我的问题是我希望它在事务中,因此如果其中一个 DB 方法失败,那么它将自动回滚待处理的更改。

我在 Stackoverflow/Microsoft 页面上阅读了一些文章,其中指出 SubmitChanges 将为我将这些内容包装在事务中。

问题是 spClearTablesForReplication 方法清除了表,后来代码故意失败(用于测试),然后我所有的表都是空的(不回滚)

XalSqlDataContext db = new XalSqlDataContext();
db.spClearTablesForReplication();
db.spUpdateStockItemGroup(ConvertToXElement(typeof(List<StockItemGroup>),    stockItemGroups));
db.spUpdateStockItemSubGroup(ConvertToXElement(typeof(List<StockItemSubGroup>),    stockItemSubGroups));

db.SubmitChanges();

任何线索/解决方案。

【问题讨论】:

    标签: c# sql linq transactionscope


    【解决方案1】:

    将您的代码包装在 TransactionScope using 块中,然后它将回滚,除非它到达您调用 transactionScope.Complete() 的位置。

    例子:

    using (TransactionScope transactionScope = new TransactionScope())
    {
        //code here
        transactionScope.Complete();
    }
    

    【讨论】:

    • 所以如果我这样做了,我就不再需要 SubmitChanges 了吗?
    • @user1914109 您的代码中不应有其他任何更改。您认为应该是事务性的操作(全有或全无),您应该使用块将其包装在 transactionScope 中,除了您现在使用的代码不应更改。
    • 所以结论 SubmitChanges 没有将数据库调用包装在事务中?
    • @user1914109 是的,SubmitChanges 确实将自己的操作包装在事务中,但如果有环境事务,它将使用环境事务。这意味着当您使用事务范围时,SubmitChanges 将登记在已经运行的事务中,并且所有事情都将在单个事务中发生。
    • 最后一个问题,我还应该使用 SubmitChanges。如果是之前或之后 transactionScope.Complete
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 2010-09-18
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多