2010-08-16 13 views
0

J'ai deux entités: User et UserRole. Il est réalisé en tant que tables dans DB et classes avec les mêmes noms. Si je crée un nouvel utilisateur, je dois créer userrole pour lui. S'il y a une exception lors de la création de l'utilisateur ou de la création d'utilisateur, il ne doit pas être créé. La question est que je ne sais pas comment faire pour essayer de bloquer les blocages. J'ai quelques alternatives:Comment utiliser try/catch lors de la sauvegarde de deux entités en une transaction?

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(); 
} 

Peut être quelqu'un sait de façon plus correcte.

+1

Quelle langue utilisez-vous? – jigfox

+0

Vous devez valider la transaction en créant l'utilisateur avant de créer le rôle? Non seulement vous ne spécifiez pas la langue, vous ne spécifiez pas la base de données. –

+0

Pourquoi divisez-vous les transactions en une seule déclaration? Le but d'une transaction est d'exécuter plusieurs instructions dans une même portée atomique. Chaque déclaration individuelle n'aurait pas besoin d'une transaction seule car elle est déjà atomique. – David

Répondre

2

La manière générale de le faire est:

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

que tout chemin jeté tout en faisant le travail fait toute transaction rollback. Seulement si vous arrivez à la fin de ... faire du travail ... sans qu'une exception soit lancée, commit sera appelé.