Поддерживает ли SQL Server Compact (CE) область транзакции requireNew внутри другой области? - PullRequest
1 голос
/ 12 октября 2009

Вот очень простой пример использования SQL Server CE 3.5 с пакетом обновления 1 (SP1), в котором я пытаюсь использовать новую транзакцию внутри существующей.

using (var db = new MyDataContext(<connection string>))
using (var ts = new TransactionScope())
{
    db.Thing.InsertOnSubmit(new Thing());
    db.SubmitChanges();
    using (var ts2 = new TransactionScope(TransactionScopeOption.RequiresNew))
    {
        db.Thing.InsertOnSubmit(new Thing());
        db.SubmitChanges();   // exception here
        ts2.Complete();
    }
    [... do more stuff ...]
    ts.Complete();
}

Это приводит к ошибке «Объект подключения не может быть зачислен в область транзакции». на второй вызов "db.SubmitChanges ()"

В этой статье говорится, что SQL CE не поддерживает два соединения внутри одной транзакции, но у меня есть только одно здесь (если только SubmitChanges () не создает другое).

Идея выше состоит в том, что если субтранзакция фиксируется, то она остается зафиксированной, даже если внешняя транзакция завершается неудачно. Насколько я понимаю, это предполагаемое использование требуетNew .

В этой статье MSDN утверждается, что SQL CE поддерживает вложенные транзакции как таковые, поэтому я думаю, что вышеупомянутое должно быть возможным. Это? Если да, то как мне изменить код, чтобы это работало?

Редактировать : хотя эта статья MSDN противоречит другой статье MSDN и говорит, что вложенные транзакции не поддерживаются. Возможно, в этом проблема?

Ответы [ 3 ]

3 голосов
/ 26 ноября 2009

В вашем случае вы не должны использовать TransactionScope.

Вам нужно будет вызвать DataContext.Transaction = DataContext.Connection.BeginTransaction и управлять своей собственной транзакцией.

3 голосов
/ 26 ноября 2009

Нет, вы не можете использовать вложенные транзакции. Запустите этот код в своей базе данных SQL CE, и вы увидите сообщение об ошибке.

BEGIN TRANSACTION;
SELECT 'GOT 1';
BEGIN TRANSACTION;
SELECT 'GOT 2';

Большая ошибка 0x80004005, Малая ошибка 27994 Microsoft SQL Server Compact не поддерживает вложенные транзакции.

0 голосов
/ 26 февраля 2011
...