본문 바로가기

프로그램&DB/ASP

ASP - Transaction (트랜잭션) 구현 by 김지민님

MS의 웹애플리케이션 기술로 ASP.NET이 충분히 자리잡고 성장하면서 올드 ASP는 서서히 무대 뒤로 스러져가고 있지만, 버블 시즌에 너무 많은 사이트들이 ASP로 개발되었기에 유지보수의 측면에서 아직도 머리에서 아주 지워버릴 수는 없는.. 애물단지 같은 녀석이죠.

DB를 활용하는 로직에 있어서 트랜잭션은 참 중요한 개념인데, ASP에서는 아래 같은 방법으로 처리할 수 있습니다.

  1. asp 페이지의 상단에,

    <%@ TRANSACTION = REQUIRED %>

    위 문장을 명시해주는 방법입니다.

    권장하는 방법은 아니지만, 간단한 루틴을 수행하는 페이지에서는 짧은 표현으로 트랜잭션을 구현할 수 있습니다.

    위 문장이 있음에 따라 자동으로 해당 페이지에서 열리는 모든 ADODB.Connection 객체는 열리자마자 트랜잭션 모드에 들어가고, 페이지가 종료될 때 commit합니다. 물론 실행 중 에러가 발생하면 rollback!

    하지만 단점이 있으니, 임의로 범위를 지정해서 트랜잭션을 구현할 수 없다는 점입니다.

    예를 들어 일정한 루틴을 반복하는 루프가 있다고 가정할 때,
    루틴이 1회째 반복될 때는 별 문제 없었을 수 있으나 2, 3회 반복될 경우엔
    1회째에서 커밋하지 않은 상태로 대기 중인 녀석과 (1)
    2, 3회 혹은 그 후에 DB에 수정을 가하려는 녀석이 (2) 충돌할 수 있습니다.

    그럴 경우엔 밉상이게도 아래와 같은 에러가 발생합니다.

    오류 유형:
    분산 트랜잭션이 완료되었습니다. 이 세션을 새 트랜잭션이나 NULL 트랜잭션에 참여하게 하십시오.

    지금 쓰는 방법은 매우 짧고 간단하지만 이런 경우에는 대책이 없습니다. 아쉽게도 ㅠㅜ;


  2. 럼 좀 귀찮지만 다음 방법~

    이번엔 페이지 상단에 특별히 명시하는 문장은 없지만, 그리고 좀 더 써 줄 문장이 많지만!
    그만큼 섬세한 컨트롤이 가능한 방법입니다.

    먼저 트랜잭션을 시작하고 싶으면, ADODB.Connection 의 BeginTrans 메소드를 호출합니다.

    그리고 원하는 쿼리를 원하는 만큼 수행하다가, 좋으면 CommitTrans, 싫으면 RollbackTrans 메소드를 호출하면 끝^^

    여기서 장점은~ CommitTrans 이나 RollbackTrans 을 수행하고 나면 다시 BeginTrans 를 실행해서 한 페이지 내에서도 여러 단위의 트랜잭션을 처리할 수 있다는 점입니다.

    Set db = Server.CreateObject("ADODB.Connection")

    db.execute("I love smile!")

    if 맘에 든다 then
      db.CommitTrans
    else
      '별로인디?
      db.RollbackTrans
    end if


    이럴 경우, A에서 어려운 케이스로 예를 든 큰 단위의 반복수행도 좀 더 잘 다룰 수 있겠죠 :)

그리고 지금에 와서는, 시대가 시대인 만큼 ASP.NET이든, Java든, Ruby든 좀 더 나은 수준의 개발도구를 쓰는 것이 좋겠다 싶습니다. 물론 쓰고 싶어 쓰진 않겠지만^^; 아무쪼록 보다 사람다운 건강한 개발자의 하루를 위해! 모두들 웃어요~