将两个实体保存为一个事务时如何使用try / catch?

时间:2010-08-16 15:12:03

标签: try-catch

我有两个实体:User和UserRole。它被实现为DB中的表和具有相同名称的类。如果我创建新用户,我必须为他创建userrole。如果在用户创建或用户角色创建期间出现异常,则无法创建用户。问题是我不知道如何设置try catch块。我有一些选择:

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 个答案:

答案 0 :(得分:2)

这样做的一般方法是:

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

这样,在工作时抛出的任何东西都会导致整个事务回滚。只有当你到达...的末尾才能正常工作......没有抛出异常会调用commit。