트랜잭션 [C # .NET을] [엔티티 프레임 워크] 연습 공유 방법 DAL

지난 달, 내 동료가 나는 CUD 방법을 공유 할 필요가에서 어떻게 업무를 작성 DAL 묻는 메시지?

우선, 공유 할 수 없습니다해야 CUD 방법에 데이터베이스의 데이터 액세스 레이어 처리에 대해 생각하는?

  •  각 데이터 트랜잭션 프로세스가 동일한 방법이 없기 때문에 사용자 각도 절단 모양 DAL와 케이스, 그것을 공유 할 수있는 기회를 갖게해서는 안된다.
  •  DAL 방법을 설계 할 때, 방법이, 날 믿어 CRUD DAO의 테이블로 사용할 수 없습니다, 그것은 단지 그 일을 더 복잡하게 만들 것입니다.
  •  DAL 일반적인 방법, 점검 메커니즘은 DAL 방식에 있습니다.

내 DAL이 같은 휴가 작업과 같은 절차에 따라 설계, 작업을 떠나 것은 DAL에 해당, 삭제, 업데이트 작업을 떠날 추가에 대한 액세스를 제공 할 것입니다 DAL 등

아래 그림과 같은 아키텍처 :


? 경우 후 경우에 사용자는 실제로 다음을 수행하는 방법, 일반적인 방법을 찾으려면, 당신을 볼
시작하기 전에 :

  • 각 당신이 전역 변수 DbConnection 수준에 속하는 경우, 우리는 소멸자는 객체를 닫습니다 사용해야합니다, 가자 즉시 실행, 독립적 인 개인 수준이어야하는 방식으로 DAL에서 DbConnection 그것은 정적 글로벌 수준의 경우, 난 단지 수 당신의 죄에 대한 부처님입니다.
  • 여기서 동일한 의미이다 ADO.NET와 DbConnection DbContext ADO.NET 엔티티 프레임 워크를 사용하는 예는,의
의 나쁜 기록을 살펴 보자 :

같은 데이터베이스 연결에서 가장 TransactionScope에없는 뇌의 사용이 가장 자원 집약적이며, 처리 제대로 당신이 거래에 대한 잠금이 많이 기다리고있을 것입니다

public int FLowA()
{
    var result = -1;
    using (var db = new FlowDbContext())//←处理数据用完就关掉
    {
        //.....TODO:处理数据
        result = db.SaveChanges();//←保存数据,db.SaveChanges 具有事务的功能
    }
    return result;
}

FlowB 좋아한다

당신이 가장 머리가 나쁜 흐름 방식의 두 가지를 병합해야하는 경우 TransactionScope에 랩을 사용하는 것입니다

public int CombineFlowAB()
{
    var result = -1;
    using (var scope = new TransactionScope())//←不好的写法,不要学
    {
        var resultA = FLowA();
        var resultB = FLowB();
        result = resultA + resultB;
        scope.Complete();
    }
    return result;
}
개선 :

첫째, 연결이 isDispose 메소드를 호출할지 여부를 결정하게, 객체 추출 매개 변수가되는 DbContext.Dispose

public int FLowA(FlowDbContext db = null)//← 首先,把连线对象抽出来变成参数,我要由外面决定事务、关闭
{
    var result = -1;
    var isDispose = false;
    if (db == null)//← 若外面没有传东西进来,我就自己建立连线,并开启 isDispose 旗标
    {
        db = new FlowDbContext();
        isDispose = true;
    }
    try
    {
        //.....TODO:处理数据
        result = db.SaveChanges();//保存数据
        return result;
    }
    finally
    {
        if (isDispose)//← 自己挖的洞自己跳
        {
            db.Dispose();
        }
    }
}

외부 메소드에 의해 호출 DbContext.Database.BeginTransaction

public int CombineFlowAB()
{
    var result = -1;
    using (var db = new FlowDbContext())
    using (var trans = db.Database.BeginTransaction())←声明事务对象,此时SaveChanges就不具有事务机制
    {
        try
        {
            var resultA = FLowA(db);
            var resultB = FLowB(db);
            result = resultA + resultB;
            trans.Commit();
            return result;
        }
        catch (Exception)
        {
            trans.Rollback();
            throw;
        }
    }
}

FlowA으로, B의 홀은 자신의 문제를 가지고, 또한 적시에 거래 토큰 릴리스 아웃하기

오류 경우, 부담 그를 게시 초보자를 알려 주시기 바랍니다

4 분기에 2010 ~ 2017의 C #

원본 : 대형 열  [C # .NET을] [엔티티 프레임 워크 ] 거래 방법 관행의 DAL


추천

출처www.cnblogs.com/chinatrump/p/11458495.html