Проблемы с получением транзакции при работе с SubSonic - PullRequest
1 голос
/ 22 марта 2011

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

Я читал сообщения об этом и пробовал различные альтернативы (переключая порядок моих операторов использования), используя 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();
                }
            }

1 Ответ

1 голос
/ 22 марта 2011

Порядок ваших операторов использования правильный (я помню порядок сам с этим трюком: Соединение должно знать о транзакции во время ее создания, и это проверяется с помощью `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

...