login register Sysop! about ME  

2018년 06월 22일 09시 38분 00초,     조회수 : 755
  제목 : DBClass 사용 시 트랜잭션 관련 문의드립니다~
SEQ : 164045 글쓴이 : quickturn

작성 포맷 : TEXT 모드, 자동 줄바꿈 사용

현재 DB 클래스파일과 상황은 아래와 같습니다.

-- DB Class
Class DBClass
	   Private conn
	   Private connStr
	   
	   'DB 오픈
    Public Sub OpenDB(str)
        If str <> "" Then 
            connStr = str
        End If

	   	   'Create DB Connection
        Set conn = Server.CreateObject("ADODB.Connection")            

        'Open DB
        conn.Open connStr
    End Sub
	   
	   '트랜잭션 시작
	   Public Function BeginTrans()
	   	   BeginTrans = conn.BeginTrans()
	   End Function	   

	   '트랜잭션 커밋
	   Public Sub CommitTrans()
	   	   conn.CommitTrans()
	   End Sub

	   '트랜잭션 롤백
	   Public Sub RollbackTrans()
	   	   conn.RollbackTrans()
	   End Sub
	   
	   '쿼리수행
	   '인자로 전달되는 com 은 Server.CreateObject("Scripting.Dictionary") 객체로 생성된 Dictionary 형태의 파라미터 
정보입니다.
	   'com 객체 안에 dicInfos 라는 리스트 형태의 객체 안에 param, type, length, value 형식으로 데이터가 들어있습니
다.
	   '소스 내용이 많아서 본문에 나열하는 것은 생략하도록 하겠습니다.
	   Public Function CmdExecute(com)
        On Error Resume Next
	   	   
	   	   Dim strQuery
	   	   Dim cmd

	   	   strQuery = com.CommandText
	   	   
	   	   set cmd = server.CreateObject("adodb.command")
	   	   set cmd.ActiveConnection = conn
	   	   cmd.CommandType = adCmdText	   
	   	   cmd.CommandText = strQuery

	   	   Dim i
	   	   For i = 0 To com.dicInfos.count-1
	   	   	   cmd.Parameters.append(cmd.CreateParameter(com.dicInfos(i)("PARAM"), com.dicInfos(i)
("TYPE"), adParamInput, com.dicInfos(i)("LENGTH"), com.dicInfos(i)("VALUE")))
	   	   Next

        Call cmd.Execute

	   	   Set com = Nothing
	   	   Set cmd = Nothing        
                  
        If Err.number <> 0 Then
	   	   	   
	   	   	   Call 오류처리

            CmdExecute = False
            Exit Function
        End If

        CmdExecute = True
    End Function
	   
	   
-- a.asp
Dim dbClass
Set dbClass = New DBClass
dbClass.OpenDB("DB_INFO")

dbClass.BeginTrans()

Select Case 파라미터변수
	   Case "실행1"
	   	   // Something TODO
	   	   If 오류발생 Then
	   	   	   dbClass.RollbackTrans()
	   	   End If
	   
	   Case "실행2"
	   	   // Something TODO
	   	   If 오류발생 Then
	   	   	   dbClass.RollbackTrans()
	   	   End If
	   
	   ...
	   
End Select

dbClass.CommitTrans()



-- b.asp
Dim dbClass
Set dbClass = New DBClass
dbClass.OpenDB("DB_INFO")

dbClass.BeginTrans()

	   // Something TODO
	   If 오류발생 Then
	   	   dbClass.RollbackTrans()
	   End If

dbClass.CommitTrans()



위와 같이 사용 중에 있을 때
http://www.domain.com/a.asp 와 
http://www.domain.com/b.asp 가 
동시에 실행된다는 상황일 경우, 각각의 커넥션과 트랜잭션으로 분리되어 있다고 볼 수 있나요?
현재 b.asp 에서 insert 되어야 할 정보들이 가끔 누락이 되는 경우가 있어서 확인해보니 a.asp 와 동시 실행되는 시점과 동일
해서 의심중인데...
저렇게 따로 New 로 객체를 생성해주었으니 당연 별도 객체 커넥션을 맺었을 것 같은데.. 아무래도 의심이 가서요...

혹시 아시는 분이 계시다면 도움을 요청 드립니다.

  taeyo
  2018-06-28(13:05)
캐릭 이미지
얼핏 보기에는 Public Sub OpenDB(str) 를 Function으로 바꾸어서 생성된 DB 개체를
반환하도록 해야 할 것 같은데요

전체적으로 클래스의 코드 구조가 좀 이상한 느낌이에요.
OpenDB(str) 함수 안에서는 mDBConn라는 이름으로 개체를 만들고,
그 외에는 conn 이라는 이름의 개체 변수를 쓰고 있고...

  quickturn
  2018-06-29(11:15)
캐릭 이미지
앗 죄송합니다... 제가 소스 수정을 해서 올리는 터에... mDBConn 수정하는 걸 놓쳤네
요;;;
말씀하셨던 mDBConn 은 클래스변수로 선언된 conn 입니다... ^^;;
본문 내용 수정하였습니다...




  taeyo
  2018-06-29(15:01)
캐릭 이미지
DBClass에 헛점이 좀 많아보입니다.
다음 강좌를 한번 참고해서 이미 살짝 검증된 DB Helper를 사용해 보시면 어떨까요?

http://taeyo.net/Columns/View.aspx?SEQ=362&PSEQ=19&IDX=3

  quickturn
  2018-06-29(17:06)
캐릭 이미지
아.. 위 DBHelper 관련해서는 보았습니다!!
하지만.. 이미 위 클래스가.. 어느 정도 규모있는 서비스에서 공통으로 사용 중이라 수정은 힘
든 상황입니다..
혹시 말씀하시는 헛점이.. 제가 의심하고 있는 트랜잭션이나 개체 생성에 대해 독립성을 보장
하지 못하는 상황이라던 가.. 그런 것도 포함이 될까요...!?



제목 작성자 날짜 조회
DBClass 사용 시 트랜잭션 관련 문의드립니다~ (4) quickturn 2018-06-22 755

 
 
.NET과 Java 동영상 기반의 교육사이트

로딩 중입니다...

서버 프레임워크 지원 : NeoDEEX
based on ASP.NET 3.5
Creative Commons License
{5}
{2} 읽음   :{3} ({4})