Dirty Read

November 1, 2007 09:09 by WebStoryMaker

참고: http://en.wikipedia.org/wiki/Dirty_Read

Write-Read Conflict 라고도 불리우는 Dirty Read 란, 두 Transaction 중에 하나의 Transaction이 데이터를 수정하고 Commit 하지 않은 상태에서 다른 Transaction 이 동일한 데이터를 수정(Update)하고 Commit 하여 수정 중에 있는 데이터가 다른 Transaction 에 의해 수정이 되는 inconsistent(일관되지 못한) 상태를 말한다.

이러한 Dirty Read 를 막기 위해서 데이터베이스의 Isolation level 을 지정해 줄 필요가 있다.

DirtyRead 를 막기 위해서 Isolation Level 을 read commited 로 지정할 수 있다.

.NET 에서의 예제)

SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["AW"].ToString());
        cn.Open();
        SqlTransaction transaction = cn.BeginTransaction(IsolationLevel.ReadCommitted);

image

 

그 외의 Isolation Level 은 다음을 참고
Set Transaction Isolation Level from MSDN2
Isolation Level from Wikipedia


Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

T-SQL: CTE 실습 예제

September 11, 2007 18:04 by WebStoryMaker

마이크로소프트(Microsoft) 에서 제공하는 샘플 데이터베이스인 Adventure Works 를 가지고 CTE (Common Table Expression) 에 대해 실습해 보도록 하겠다. 결코 간단하지 않은 문제이지만 CTE를 사용하여 효과적으로 데이터를 업데이트 하도록 하겠다.

일단, Adventure Works 데이터베이스를 보면 마이크로소프트 사에서 일부러 그렇게 한 것인지는 모르겠지만 Product ID 709 의 판매금액이 모든 Sales Person 의 판매실적량에 더해져 있지 않다.

아래의 쿼리를 사용하여 SalesPerson ID 가 268인 판매원의 판매실적 677558.4653 을 기억해 두자. 이 값은 709 제품을 판매한 값이 포함되어 있지 않다. (왜 그런지는 직접 찾아보세요..)

사용자 삽입 이미지

그러면 709를 판매한 판매원들의 금액합계는 어떻게 구하면 될까. 다음의 쿼리를 참고하여 보면,

위와 같은 결과를 낸다. 다시 말해, 쿼리문을 보면 조건부에서 Product ID 가 709 인 경우를 찾았다. 709 번호의 제품을 판매한 금액의 합계가 SalesPersonID 별로 나오게 되었다.
그러면 이제 이 결과물을 사용하여 Sales.SalesPerson 의 SalesYTD 를 업데이트 하면 된다. 어떻게 하면 될까? 머리속에 당장 떠오르지는 않을 것이지만 CTE를 사용하여 쉽게 접근해 보도록 하겠다.

CTE 문을 사용하여 이전에 얻었던 결과물을 LineTotalReports 라는 이름의 CTE 로 임시 생성한 후에 Update 문에서 참조하였다. 그 아랫 부분을 살펴보면 SalesYTD 의 원래 값에 709 제품을 판매한 총 합계 금액을 더하였다. 이렇다면 이제 MS 에서 빠뜨린 709 제품은 판매금액을 판매원의 실적에 더한 셈이다.
사용자 삽입 이미지

결과를 확인해보자.

결과의 값은 LineTotal 인 102.6 이 더해진 677661.0653 을 나타내고 있다. 성공!
* CTE 에 대한 기본적인 설명은 이전 기사문을 통해 확인하실 수 있습니다.

----------------- 추가 ------------------------
CTE를 사용하지 않은 일반적 Query 는 아래와 같다

일반 Query 문 (Language : sql)

   1:  UPDATE  Sales.SalesPerson
   2:  SET SalesYTD = SalesYTD +
   3:      (
   4:      SELECT  isNull(sum(lineTotal), 0)
   5:      FROM    Sales.SalesOrderHeader soh
   6:      JOIN Sales.SalesOrderDetail sod 
   7:      ON soh.SalesOrderID = sod.SalesOrderID
   8:      WHERE   sod.ProductID = 709
   9:      AND soh.SalesPersonID = Sales.SalesPerson.SalesPersonID
  10:      )

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5