Как использовать try / catch при сохранении двух сущностей как одной транзакции? - PullRequest
0 голосов
/ 16 августа 2010

У меня есть две сущности: User и UserRole. Реализуется как таблицы в БД и классы с одинаковыми именами. Если я создаю нового пользователя, я должен создать userrole для него. Если есть исключение во время создания пользователя или создания пользовательской роли, пользователь не должен быть создан. Вопрос в том, что я не знаю, как установить блоки try try. У меня есть несколько альтернатив:

1)

try
{
  UserDA.BeginTransaction();
  try
  {
    UserDA.Save(newUser);
    UserDA.CommitTransaction();
  }
  catch()
  {
   throw SomeException;
   UserDA.RollbackTransaction();
  }

  UserRoleDA.BeginTransaction();
  try
  {
    UserRoleDA.Save(newUser);
    UserRoleDA.CommitTransaction();
  }
  catch()
  {
   throw SomeException;
   UserRoleDA.RollbackTransaction();
  }
}
catch()
{
  //catch user creation exception
}

2)

UserDA.BeginTransaction();
try
{
  UserDA.Save(newUser);
  UserDA.CommitTransaction();
  UserRoleDA.BeginTransaction();
      try
      {
        UserRoleDA.Save(newUser);
        UserRoleDA.CommitTransaction();
      }
      catch()
      {
       throw SomeException;
       UserRoleDA.RollbackTransaction();
      }
}
catch()
{
  //catch 
  UserDA.RollbackTransaction();
}

Может быть, кто-то знает более правильный путь.

1 Ответ

2 голосов
/ 16 августа 2010

Общий способ сделать это:

Try{
    StartTransaction
    ...do work...
    CommitTransaction
}
catch(Exception)
{
    RollbackTransaction
}

Таким образом, все, что выбрасывается во время работы, вызывает откат всей транзакции.Только если вы достигнете конца ... делайте работу ... без исключения, вызывается commit.

...