2013-04-18 1 views
2

일반적으로에는 TransactionScope- 인식을 나타내는 인터페이스가 있습니까? TransactionScope을 활용하는 일반적인 데이터 라이브러리 목록이 있습니까? (DbConnection을 확장하거나 IDbConnection을 구현하는 것이 있습니까?)TransactionScope와 협력하는 데이터베이스 라이브러리는 무엇입니까?

TransactionScope과 협력 데이터 라이브러리 간의 관계는 무엇입니까? 즉, TransactionScope은 어떤 식 으로든 활성 연결을 검색하고 적절한 시작/커밋/롤백 메서드를 호출합니까? 데이터 라이브러리가 주위 TransactionScope s를 찾습니까? 아니면 둘다?

배경이 필요한 경우. 몇 가지 서로 다른 트랜잭션과 같은 전략을 활용하는 예전 DAL을 다루고 있습니다.

// 
// transactionless queries 
// 

// Microsoft.Practices.EnterpriseLibrary.Data. ... 
Database db = SQLHelper.GetDatabase(); 
DbCommand cmd = db.GetStoredProcComment("doSomething"); 
db.AddInParameter(cmd, "p1", DbType.Guid, Id); 
using (IDataReader r = db.ExecuteReader()) 
{ 
    // etc. 
} 


// 
// Transaction objects being passed around and attached to DbCommands 
// 

// somewhere up the line ... 
DbConnection con = TransactionScopeConnections.GetConnection(db); 
DbTransaction transaction = con.BeginTransaction(); 

// Microsoft.Practices.EnterpriseLibrary.Data. ... 
Database db = SQLHelper.GetDatabase(); 
DbConnection con = TransactionScopeConnections.GetConnections(db); 
DbCommand cmd = db.GetStoredProcComment("doSomething"); 
cmd.Transaction = transaction; 
db.AddInParameter(cmd, "p1", DbType.Guid, Id); 
using (IDataReader r = db.ExecuteReader()) 
{ 
    // etc. 
} 


// 
// queries in TransactionScopes 
// 

using (TransactionScope scope = new TransactionScope()) 
{ 
    // Microsoft.Practices.EnterpriseLibrary.Data. ... 
    Database db = SQLHelper.GetDatabase(); 
    DbCommand cmd = db.GetStoredProcComment("doSomething"); 
    db.AddInParameter(cmd, "p1", DbType.Guid, Id); 
    using (IDataReader r = db.ExecuteReader()) 
    { 
    // etc. 
    } 
    scope.Complete(); 
} 


// 
// both 
// 

Database db = SQLHelper.GetDatabase(); 
using (TransactionScope transactionScope = new TransactionScope()) 
{ 
    DbConnection con = TransactionScopeConnections.GetConnection(db); 
    DbTransaction transaction = con.BeginTransaction(); 

    /* ... build query ... */ 

    query.transaction = transaction; 

    /* ... execute query, read results, if any ... */ 

    transaction.Commit(); 
    transactionScope.Complete(); 

} 

Enterprise 라이브러리에서 유효한 옵션은 모두 있습니까? TransactionScope 양식이 의미가 있습니까? 마지막 양식이 중복 될 수 있습니까?

+0

왜 VTC입니까? 질문이 명확하지 않거나 너무 광범위하다면 침묵하는 VTC보다는 건설적인 피드백이 좋을 것입니다! (이전 DAL을 통해 적극적으로 정렬하고 진행 상황을 이해하려고 시도합니다!) – svidgen

+0

이것은 라이브러리와 아무 관련이 없습니다. 도서관이 밑에 사용하는 것과 관련이 있습니다. 그들이 ADO.NET을 사용한다면, 당신은 황금색입니다 (연결 문자열에 의해 호출 된 ADO.NET 제공자가 TransactionScope를 지원한다고 가정). –

+0

@JohnSaunders 그렇다면 라이브러리에서 반환 한 데이터베이스 및/또는 연결 유형이 호환 가능한지 여부를 알아 보려면 무엇을 알아야합니까? 그리고이 객체들 사이의 관계의 본질은 무엇입니까? 즉, 연결을 만들고 트랜잭션을 생성해야합니까? 다른 길은? 아니면 주문하나요? – svidgen

답변

0

질문에 대답하려면 TransactionScope와의 호환성을 나타내는 인터페이스가 있습니까? 또는 TransactionScope를 활용하는 데이터베이스 유형 개체 목록?

예. IDBTransaction 인터페이스를 사용하여 .NET Framework 데이터 공급자 액세스 관계형 데이터베이스 구현을 고려할 수 있습니다.

나는 MSDTC와 같은 전체 분산 트랜잭션으로 트랜잭션을 승격하고자 할 때 TransactionScope을 사용하는 것으로 나타납니다. TransactionScope 자체는 ADO.NET에만 국한되지 않고 Scope and More

+0

그래서'IDBTransaction'을 구현하는 모든 것이'TransactionScope'와 협력하게됩니까? ... 답장하는 일반적인 질문을 최전선으로 가져 오도록 질문을 재정렬했습니다. 또한 두 번째 단락의 질문에 답하는 방법을 알고 있습니까? TransactionScope와 협력 라이브러리 사이의 상호 작용은 무엇입니까? – svidgen

+0

수정 된 답변보기 – Turbot

관련 문제