2010-08-16 4 views
0

두 개의 엔티티 User : UserRole이 있습니다. 동일한 이름의 DB 및 클래스의 테이블로 실현됩니다. 새 사용자를 만들면 그를 위해 userrole을 만들어야합니다. 사용자 생성 또는 사용자 생성 중에 예외가 발생하면 사용자를 생성 할 수 없습니다. 질문은 try catch 블록을 설정하는 방법을 모른다.두 엔티티를 하나의 트랜잭션으로 저장할 때 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

어떤 언어를 사용하고 있습니까? – jigfox

+0

역할을 만들기 전에 사용자를 생성하는 트랜잭션을 커밋해야합니까? 언어를 지정하는 것뿐만 아니라 데이터베이스를 지정하지 않습니다. –

+0

왜 각각 하나의 성명서 만 가지고 거래를 해체합니까? 트랜잭션의 요점은 하나의 원자 범위 내에서 여러 명령문을 실행하는 것입니다. 각각의 개별 문장은 이미 원자 적이기 때문에 자체적으로 트랜잭션이 필요하지 않습니다. – David

답변

2

이 일의 일반적인 방법은 다음과 같습니다 일을하는 롤백 전체 트랜잭션이 발생하는 동안 발생

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

그 방법의 아무것도. 작업의 끝 부분에 도달 한 경우에만 ... 예외가 발생하지 않고 던져지면 커밋됩니다.

관련 문제