2010-08-08 5 views
2

asp.net 애플리케이션 용 데이터 액세스 레이어를 구축 중입니다. 거래를 관리하기 위해 여러 클래스 간의 연결을 공유하고 싶지만 그렇게하는 방법을 모르겠습니다.데이터 액세스 레이어에서 연결 및 트랜잭션 공유

예 :

내가 2 개 클래스, 주문 및 OrderDetail 있습니다.

새 주문의 SQL 삽입을 위해 DAL 주문 클래스를 호출 할 것입니다.

Insert 메서드 내에서 OrderDetail 클래스를 호출하여 주문 세부 정보를 삽입하고 싶습니다. 동일한 연결 및 트랜잭션을 사용하여이를 수행합니다.

누군가 건축 설계를 제안 할 수 있습니까? 아니면 누군가 인터넷에서 자원을 제공 할 수 있습니까?

예를 들어 명확히하기를 바랍니다. 제 영어가 싫습니다!

감사합니다.

+0

답변 중 원하는 답변이 있으면 답변으로 표시 할 수 있습니까? –

답변

3

나는 당신이 지금 트랜잭션을 공유하고 연결 코드를 그대로 두는 것이 좋습니다. 연결은 풀링되므로 연결을 여는 것은 최소한의 성능 영향을 가져야합니다. 은 동일한 트랜잭션을 사용해야하지만 그렇지 않으면 주문 및 주문 세부 정보 삽입이 원자 적 연산이 아닙니다 (코드가 중간에 실패하면 데이터베이스에서 불완전한 순서로 끝납니다).

거래를 '공유'하는 가장 좋은 방법은 TransactionScope 클래스를 사용하는 것입니다. 소위 ambient transaction을 만듭니다. 주변 거래의 범위 내에서 열리는 모든 SqlConnection은 자동으로이 거래의 일부가됩니다.

앰비언트 트랜잭션을 사용하는 경우 더 이상 SqlConnection.BeginTransaction을 사용하거나 사용해야하지 않습니다.

+0

로널드 감사합니다, TransactionScope 내가 원하는 것 같습니다. Order 클래스에서 ok 일 수 있고 Order Header를 삽입 한 다음 자세한 내용을 보려면 OrderSchedule 내부에서 OrderDetail의 Insert 메서드를 여러 번 호출합니다. 그러나 OrderDetail의 Insert 메서드를 직접 호출하여 세부 정보를 추가하기위한 순서를 수정할 때도 사용할 수 있습니다.이 경우 OrderDetail의 Insert에는 자체 트랜잭션이 있어야합니다. 그게 뭐죠? 내가 무슨 뜻인지 이해하시기 바랍니다. – opaera

+0

귀하의 요지를 이해하지만 OrderDetail의 Insert 메소드 내에 다른 트랜잭션을 제공 할 필요가 없습니다. 트랜잭션이 이미 사용 가능하기 때문입니다. 이 메서드 내에서 Transaction.Current를 호출하여 테스트 할 수 있습니다. Order 메소드 내에서 열었지만 트랜잭션이 반환되는 것을 볼 수 있습니다. –

+0

다시 한 번 감사드립니다. Ronald. TransactionScope에 대해 읽고 있는데이 기사를 발견했습니다 : http://blogs.msdn.com/b/dbrowne/archive/2010/05/21/using-new-transactionscope-considered-harmful.aspx timeout 및 isolationlevel, 많은 삽입 작업 (SQL Server 2008에서)이 수행되는 응용 프로그램에 대해 무엇을 제안합니까? (예 : 수천 개의 항목이있는 카탈로그 설정) – opaera

관련 문제