Проблемы с получением транзакции при работе с SubSonic

У меня возникли небольшие проблемы с получением транзакции с несколькими удалениями, работающей с использованием SubSonic в ASP.NET/SQL Server 2005. Кажется, она всегда вносит изменения в базу данных даже без вызова метода complete для объекта transactioncope?

Я читал сообщения об этом и пробовал различные альтернативы (переключение порядка моих операторов using), используя DTC, не используя DTC и т. Д., Но пока без радости.

Я собираюсь предположить, что проблема в моем коде, но я не могу определить проблему - может ли кто-нибудь помочь? Я использую SubSonic 2.2. Пример кода ниже:

using (TransactionScope ts = new TransactionScope())
            {
                using (SharedDbConnectionScope sts = new SharedDbConnectionScope())
                {
                    foreach (RelatedAsset raAsset in relAssets)
                    {
                        // grab the asset id:
                        Guid assetId = new Select(RelatedAssetLink.AssetIdColumn)
                            .From<RelatedAssetLink>()
                            .Where(RelatedAssetLink.RelatedAssetIdColumn).IsEqualTo(raAsset.RelatedAssetId).ExecuteScalar<Guid>();

                        // step 1 - delete the related asset:
                        new Delete().From<RelatedAsset>().Where(RelatedAsset.RelatedAssetIdColumn).IsEqualTo(raAsset.RelatedAssetId).Execute();

                        // more deletion steps...
                    }

                    // complete the transaction:
                    ts.Complete();
                }
            }

person Knoxy    schedule 22.03.2011    source источник


Ответы (1)


Порядок ваших операторов using правильный (я сам помню порядок с этим трюком: Connection должен знать о транзакции во время ее создания, и он делает это, проверяя System.Transactions.Transaction.Current).

Один совет: вам не нужно использовать двойные скобки. И вам не нужна ссылка на SharedDbConnectionScope (). Это выглядит намного более читаемым.

using (var ts = new TransactionScope())
using (new SharedDbConnectionScope())
{
    // some db stuff

    ts.Complete();
}

Во всяком случае, я не понимаю, почему это не должно работать. Если проблема связана с MSDTC, произойдет исключение.

Я мог только представить, что есть проблема в конфигурации SqlServer 2005, но я не эксперт по SqlServer.

Возможно, вам стоит попробовать какой-нибудь демонстрационный код, чтобы убедиться, что транзакции работают:

using (var conn = new SqlConnection("your connection String");
{
    conn.Open();
    var tx = conn.BeginTransaction();

    using (var cmd = new SqlCommand(conn)
        cmd.ExecuteScalar("DELETE FROM table WHERE id = 1");

    using (var cmd2 = new SqlCommand(conn)
        cmd2.ExecuteScalar("DELETE FROM table WHERE id = 2");


    tx.Commit();
}

А subsonic поддерживает собственные транзакции без использования TransactionScope: http://subsonicproject.com/docs/BatchQuery

person Jürgen Steinblock    schedule 22.03.2011