C#中的事务和嵌套事务

时间:2016-02-18 11:28:06

标签: c# transactions

我阅读了很多关于Transaction的文章,但是我想构建我自己的嵌套事务示例,看看它在c#中是如何工作的。我已经在SQl中对它们有了一个很好的想法,但C#给了我一个艰难的时刻。我来这里是为了解释嵌套交易的工作原理。 我尝试了以下代码来检查内部事务是否将被提交。由于TransactionScope属性为RequiresNew,内部事务应该执行,但我在外部事务中引入了故意的Unique key违规,而我的内部事务没有执行。为什么?我的概念搞砸了吗?

Database _Cataloguedatabase = DatabaseFactory.CreateDatabase();

public void TransferAmountSuppress(Account a)
{
    var option = new TransactionOptions();
    option.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
    try
    {
        using (TransactionScope outerScope = new TransactionScope(TransactionScopeOption.RequiresNew, option))
        {
            using (DbCommand cmd = _Cataloguedatabase.GetStoredProcCommand(SpUpdateCredit))
            {
                _Cataloguedatabase.AddInParameter(cmd, CreditAmountParameter, DbType.String, a.Amount);
                _Cataloguedatabase.AddInParameter(cmd, CodeParameter, DbType.String, a.Code);
                _Cataloguedatabase.ExecuteNonQuery(cmd);
            }
            using (TransactionScope innerScope = new TransactionScope(TransactionScopeOption.RequiresNew, option))
            {
                using (DbCommand cmd = _Cataloguedatabase.GetStoredProcCommand(SpUpdateDebit))
                {
                    _Cataloguedatabase.AddInParameter(cmd, DebitAmountParameter, DbType.String, a.Amount);
                    _Cataloguedatabase.ExecuteNonQuery(cmd);
                }
                innerScope.Complete();
            }
            outerScope.Complete();
        }
    }
    catch (Exception ex)
    {
        throw new FaultException(new FaultReason(new FaultReasonText(ex.Message)));
    }
}

0 个答案:

没有答案