TransactionScope无法正常使用2层数据库设置

时间:2012-10-24 18:56:55

标签: c# ado.net transactionscope

我有一个方法可以达到2种方法。一个处理插入,另一个处理更新。我在这两种方法中设置了一个事务范围,所以如果有任何问题,它会回滚。我注意到它正在将数据放入数据库中,但是在出错时它并没有删除它。我已经尝试了范围的RequiresNew和必需选项,但这似乎没有什么区别。

其他信息: 这些存储过程实际上存储在“实用程序”数据库中,该数据库保存存储过程但实际上是在不同数据库中修改记录。

此方法会将大约700条记录插入40个不同的表中。

主要方法

using (var scope = new TransactionScope(TransactionScopeOption.Required))
{
    foreach (var change in changes)
    {
        switch (change.ChangeType)
        {
            case ChangeTypeEnum.Insert:
                var result = DataAccess.InsertTableRow(sourceEnvironmentId, SuperClientVendorID,
                                                       DatabaseName, DataRouteName, change,
                                                       typeNamespace);
                postList.Add(result);
                break;
            case ChangeTypeEnum.Update:
                DataAccess.UpdateTableRow(sourceEnvironmentId, SuperClientVendorID, DatabaseName,
                                          DataRouteName, change, typeNamespace);
                postList.Add(change);
                break;
        }
    }

    scope.Complete();
}

插入方法

var sproc = string.Format("Carma.usp_{0}_{1}_ins", databaseName, managedState.TypeName);
var connString = DataAccessManager.GetConnectionString(executionEnvironment, superClientVendorID, routeName, sproc, false);

using (var newConnection = new SqlConnection(connString))
{
    newConnection.Open();

    using (var newSqlCommand = new SqlCommand(sproc, newConnection))
    {
        newSqlCommand.CommandType = CommandType.StoredProcedure;
        newSqlCommand.CommandTimeout = Setup.TimeOut;
        newSqlCommand.Parameters.AddRange(GetParameters(managedState, typeNamespace, true));

        newSqlCommand.ExecuteNonQuery();

        return managedState;
    }
}

1 个答案:

答案 0 :(得分:0)

所以一位同事能够帮我解决这个问题..这里有修改后的代码,希望能帮到那里的人:)

通话方式:

using (var scope = new TransactionScopeMS())
{
    foreach (var change in changes)
    {
        switch (change.ChangeType)
        {
             case ChangeTypeEnum.Insert:
                  var result = DataAccess.InsertTableRow(sourceEnvironmentId, SuperClientVendorID,
                                                               DatabaseName, DataRouteName, change,
                                                               typeNamespace);
                  postList.Add(result);
                  break;
             case ChangeTypeEnum.Update:
                  DataAccess.UpdateTableRow(sourceEnvironmentId, SuperClientVendorID, DatabaseName,
                                                  DataRouteName, change, typeNamespace);
                  postList.Add(change);
                  break;
        }
    }

    scope.Complete();
}

插入方法:

using (IDbConnection newConnection = TransactionScopeMS.Current.GetConnection(connectionString))
        {
            using (IDbCommand newSqlCommand = newConnection.CreateCommand(sproc, CommandType.StoredProcedure, TransactionScopeMS.Current.GetTransaction(connectionString)))
            {

                foreach (var pram in GetParameters(managedState, typeNamespace, true))
                {
                    newSqlCommand.Parameters.Add(pram);
                }

                newSqlCommand.ExecuteNonQuery();

                return managedState;
            }
        }