Использование транзакций с дозвуковой - PullRequest
7 голосов
/ 26 мая 2009

В моем веб-приложении я должен вести аудит действий пользователя. Поэтому всякий раз, когда пользователь предпринимает какое-либо действие, я обновляю объект, для которого выполняется действие, и сохраняю контрольный журнал этого действия.

Теперь Если я сначала изменил объект, а затем обновил контрольный журнал, но контрольный журнал не прошел, что тогда?

Очевидно, мне нужно откатить изменения в измененном объекте. Я могу использовать Sql-Transactions в простом приложении, но я использую Subsonic для общения с БД. Как мне справиться с ситуацией?

Ответы [ 3 ]

15 голосов
/ 27 мая 2009

Ответ , заданный @ Kevinw , совершенно в порядке. Я публикую это как перевод его ответа на код C #. Я не использую комментарии, поскольку они не будут форматировать код :) Также я использую try / catch, чтобы узнать, должна ли транзакция завершиться или откатиться.

using (System.Transactions.TransactionScope ts = new TransactionScope())
{
    using (SharedDbConnectionScope scs = new SharedDbConnectionScope())
    {
        try
        {
            //do your stuff like saving multiple objects etc. here 

            //everything should be completed nicely before you reach this
            //line if not throw exception and don't reach to line below
            ts.Complete();
        }
        catch (Exception ex)
        {
            //ts.Dispose(); //Don't need this as using will take care of it.
            //Do stuff with exception or throw it to caller
        }
    }
}
10 голосов
/ 26 мая 2009

Что-то вроде:

Using ts As New System.Transactions.TransactionScope()
  Using sharedConnectionScope As New SubSonic.SharedDbConnectionScope()

' Do your individual saves here

' If all OK
      ts.Complete()

   End Using
End Using
1 голос
/ 12 ноября 2009

Неа. Если я поставлю SharedDbConnectionScope за пределами изменений, они будут видны в базе данных до ts.Complete(). Помещение его внутрь блокирует сервер до завершения операции.

...