0

Pls는이 첫째를 참조하십시오 Good Coding Practices사용하여 트랜잭션

그래서,이 내 디자인입니다.

  1. 웹 사이트 2.Business 논리 계층 3.DALFacade에서 4.DAL

(우리는 2 개 개의 다른 상점, SQL 및 DB2를 사용하기 때문에 우리는 데이터 액세스를 숨길 dalfacade 사용) DAL 우리는 작업 단위 패턴과 저장소 패턴을 사용합니다. 1. 큰 문제는 다음과 같습니다. 아래의 코드가 비즈니스 로직에서 생성 된 트랜잭션에 대해 정상적으로 실행되는 경우.

Page: 

public partial class NewBonusRequest : System.Web.UI.Page 
{ 

    #region Constructor and Instantiation of Business Logic 
     /// <summary> 
     /// Property that holds the Business Logic type to call methods 
     /// </summary> 
     public IRequestBL RequestBL { get; private set; } 

     /// <summary> 
     /// The default constructor will use the default implementation of the business logic interface 
     /// </summary> 
     public Request() 
      : this(new RequestBL()) 
     { 
     } 

     /// <summary> 
     /// The constructor accepts a IEcoBonusRequestFacade type 
     /// </summary> 
     /// <param name="ecoBonusRequestBL">IEcoBonusRequestFacade type</param> 
     public NewRequest(IRequestBL RequestBL) 
     { 
      RequestBL = RequestBL; 
     } 
    #endregion 


    protected void PageLoad(object sender, EventArgs e) 
    { 
     if(!Page.IsPostBack) 
     { 

     } 
    } 


    #region Control Events 
     protected void BtnSubmitRequestClick(object sender, EventArgs e) 
     { 
      var request= new Request 
             { 
              IsOnHold = true 
              //All other properties go here. 
             }; 

      RequestBL.Save(request); 
     } 



    Business Logic Code. 

    public interface IRequestBL 
    { 
     void Save(Request request); 
    } 

    /// <summary> 
    /// Class in charge of the business logic for EcoBonusRequest 
    /// </summary> 
    public class RequestBL : IRequestBL 
    { 
     /// <summary> 


     /// <summary> 
     /// Saves a new ecobonus request into database and evaluate business rules here 
     /// </summary> 
     /// <param name="ecoBonusWorkflow">EcoBonusWorkflow entity</param> 
     public void Save(Request Request) 
     { 
      using (var scope = new TransactionScope()) 
      { 
       Request.Save(request); 
       // Call to other DALCFacade methods that insert data in different tables 
       // OtherObject.Save(otherobject) 
       scope.Complete(); 
      } 
     } 
    } 

답변

1

예, 동일한 스레드에서 EF는 트랜잭션 범위가 존재하면이를 적절히 고려합니다. EF는 이미 새로운 트랜잭션을 생성하지 않습니다.

그러나 트랜잭션없이 데이터베이스를 쿼리하면 더러운 읽기가 발생하므로주의해야합니다. EF는 존재하지 않을 경우 트랜잭션에서 아무 것도 읽지 않으므로 변경 내용을 저장하는 동안 존재하지 않으면 새 트랜잭션을 만듭니다.

코드에서 트랜잭션의 변경 내용 만 저장하지만 읽는 동안주의해야하며 범위 내에서 더 작은 단위로 쿼리를 캡슐화해야합니다.

관련 문제