웹 애플리케이션을 개발할 때 데이터 쿼리, 삽입, 업데이트 및 삭제와 같은 작업을 완료하려면 항상 데이터베이스에 액세스해야 합니다. 애플리케이션 로직의 영향을 받아 여러 데이터베이스 작업 명령을 작업 단위(트랜잭션)로 결합해야 하는 경우가 있습니다. 데이터베이스에서 트랜잭션은 데이터를 한 상태에서 다른 상태로 변환하는 일련의 논리적 운영 단위를 나타냅니다. 데이터베이스의 데이터 일관성을 보장하려면 데이터를 논리적 단위의 개별 그룹에서 작동해야 합니다. 모든 작업이 완료되면 데이터의 일관성을 유지할 수 있지만 해당 장치의 일부 작업이 실패하면 전체가 작동합니다. 트랜잭션이 무시되고 시작점 이후의 모든 작업이 시작 상태로 돌아갑니다.
실제로 데이터베이스의 모든 작업은 기본적으로 암시적으로 트랜잭션입니다. 이 기사에서는 일반적인 사용자 등록 프로그램을 예로 들어 ASP를 사용하여 트랜잭션 처리를 구현하는 세 가지 방법(ASP 데이터베이스 구성 요소 기반 솔루션, 데이터베이스 내의 트랜잭션 처리 메커니즘 기반 솔루션, MTS 구성 요소 기반 솔루션)을 소개합니다. .
프로그램 기능
SQL Server 데이터베이스에 USER 테이블과 USERDOC 테이블이라는 두 개의 테이블을 만듭니다. USER 테이블에는 등록된 사용자의 사용자 이름과 비밀번호가 저장되고, USERDOC 테이블에는 등록된 사용자의 개인정보가 사용자 이름으로 인덱싱되어 저장됩니다. 다음은 USER 및 USERDOC 테이블의 정의입니다.
테이블 USER(userName varchar(30),userPasswd varchar(30)) 생성
테이블 만들기 USERDOC(userName varchar(30),Age int,Sex int,PhoneNumber varchar(20),Address varchar(50))
사용자가 등록을 요청하면 ASP 스크립트는 먼저 사용자 이름과 비밀번호를 USER 테이블에 삽입한 다음 USERDOC에 사용자의 개인정보(연령, 성별, 연락처, 집 주소 등)를 테이블에 삽입합니다. 동시에 애플리케이션은 USER 테이블의 각 레코드가 USERDOC 테이블의 해당 레코드를 가지고 있는지 확인해야 합니다.
방법 1은 ASP 기본 제공 ADO 구성 요소의 연결 개체를 사용하여 데이터베이스 작업의 트랜잭션 처리를 구현합니다. Connection 개체의 일부 메서드는 다음과 같습니다.
●Connection.BeginTrans 메서드: 트랜잭션을 시작합니다.
●Connection.CommitTrans 메서드: 트랜잭션을 완료/제출합니다.
●Connection.RollBackTrans 메소드: 트랜잭션을 실행 취소/포기합니다.
//트랜잭션 작업 시작
<%Conn.BeginTrans%>
<% sqlText="USER(userName,userPasswd) 값에 삽입('" %>
<% sqlText=sqlText & request("usrName") & "','"&request("usrPasswd")&"') " %>
<% conn.execute(sqlText) %>
<% if conn.Errors.Count>0이면 %>
<% 연결.오류.지우기 %>
//데이터 삽입 작업이 실패하면 트랜잭션이 롤백됩니다.
<% conn.RollBackTrans %>
<% 응답.Redirct RegisterFail.html %>
<%는 %인 경우 종료>
<% sqlText="USERDOC(사용자 이름, 나이, 성별, 전화번호, 주소)에 삽입 "%>
<% sqlText=sqlText & "values('"& 요청 ("usrName") & "', " & request("Age") %>
<% sqlText=sqlText & ",'" & 요청 ("PhoneNum") & "','" %>
<% sqlText=sqlText & request("주소") & "') " %>
//트랜잭션 단위의 두 번째 insert 문을 실행한다.
<% conn.execute(sqlText) %>
<% if conn.Errors.Count>0이면 %>
<% 연결.오류.지우기 %>
//작업이 실패하면 트랜잭션이 롤백됩니다.
<% conn.RollBackTrans %>
<% 응답.Redirct RegisterFail.html %>
<%는 %인 경우 종료>
//전체 트랜잭션 작업이 올바르게 실행되면 트랜잭션을 커밋합니다.
<% Conn.CommitTrans %>
//등록성공 처리 페이지로 이동
<% 응답.Redirct RegisterOk.html %>
방법 2는 데이터베이스 시스템 내의 트랜잭션 처리 메커니즘을 사용하여 데이터베이스 서버에 트랜잭션이 포함된 저장 프로시저를 작성함으로써 데이터 작업의 트랜잭션 처리를 완료할 수 있습니다. 동시에 ADO 구성 요소를 사용하여 저장 프로시저를 호출하면 저장 프로시저의 반환 코드를 기반으로 트랜잭션이 성공적으로 실행되었는지 여부를 확인할 수도 있습니다.
데이터베이스 시스템에서 각 SQL 문은 트랜잭션입니다. 따라서 각 문이 완료되거나 처음으로 돌아가는 것이 보장됩니다. 그러나 일련의 SQL 문 작업을 모두 완료하거나 모두 유효하지 않게 하려면 이를 달성하기 위해 데이터베이스의 트랜잭션 처리 메커니즘을 사용해야 합니다.
데이터베이스에 저장 프로시저를 생성하는 주요 코드는 다음과 같습니다.
proc RegisterUser (@usrName varchar(30), @usrPasswd varchar(30),@age int, @PhoneNum varchar(20), @Address varchar(50) )을 시작으로 생성합니다.
//정의를 표시하고 트랜잭션을 시작합니다.
트랜스를 시작하다
USER(userName,userPasswd) 값(@usrName,@usrPasswd)에 삽입
@@error<>0인 경우
시작하다
//작업이 실패하면 트랜잭션이 롤백됩니다.
롤백 트랜잭션
//저장 프로시저로 돌아가서 반환 코드를 트랜잭션 작업 실패로 설정합니다.
반환 -1
끝
USERDOC(사용자 이름, 나이, 성별, 전화번호, 주소)에 삽입
값(@Usrname,@age,@PhoneNum,@Address)
@@error<>0인 경우
시작하다
//작업이 실패하면 트랜잭션이 롤백됩니다.
롤백 트랜잭션
반환 -1
끝
//작업이 올바르게 수행되면 트랜잭션을 커밋합니다.
트랜을 커밋하다
0을 반환
끝
ASP 스크립트에서 데이터베이스 저장 프로시저를 호출하는 주요 코드는 다음과 같습니다.
<% Set Comm=server.CreateObject
("ADODB.명령") %>
<% Comm.ActiveConnection=conn %>로 설정
<% Comm.CommandType=adCmdStoredProc %>
<% Comm.CommandText="RegisterUser" %>
//매개변수 객체를 반환하는 저장 프로시저 생성
<% Set RetCode=Comm.CreateParameter
("RetCode",adInteger,adParamReturnValue) %>
//저장 프로시저 입력 매개변수 객체 생성
<% Set usrName=Comm.CreateParameter ("usrName",adVarchar,adParamInput,30) %>
<% Set usrPwd=Comm.CreateParameter
("usrPasswd",adVarchar,adParamInput,30) %>
<% 연령 설정=Comm.CreateParameter("age",adInteger,adParamInput) %>
<% Set PhoneNum=Comm.CreateParameter
("PhoneNum",adVarchar,adParamInput, 20) %>
<% Set Address=Comm.CreateParameter("Address",adVarchar,adParamInput,50) %>
<% Comm.Parameters.Append usrName %>
<% Comm.Parameters.Append usrPwd %>
<% Comm.Parameters.Append age %>
<% Comm.Parameters.Append PhoneNum %>
<% 통신 매개변수.추가 주소 %>
<% Comm.Parameters("usrName")=request("usrName") %>
<% Comm.Parameters("usrPasswd")=request("usrPasswd") %>
<% Comm.Parameters("age")=request("age") %>
<% Comm.Parameters("PhoneNum")=request("PhoneNum") %>
<% Comm.Parameters("주소")=request("주소") %>
<% 통신 실행 %>
<% RetValue=Cint(Comm("RetCode")) %>
//데이터베이스 저장 프로시저 반환 코드를 기반으로 등록 성공 여부를 확인합니다.
<% 만약 RetValue< 0이면 %>
<% 응답.Redirect RegisterFail.html %>
<% 그 외 %>
<% 응답.Redirect RegisterOk.html %>
<%는 %인 경우 종료>
방법 3: MTS(Microsoft Transaction Server) 구성 요소의 트랜잭션 처리 메커니즘을 사용하여 트랜잭션 처리를 구현할 때 트랜잭션에 여러 구성 요소의 개체가 필요한 경우 이 메커니즘의 트랜잭션이 여러 ASP 페이지에 걸쳐 있을 수 없다는 사실에 특별한 주의를 기울여야 합니다. , ASP 페이지에서 이러한 개체에 대한 작업을 결합해야 합니다.
먼저 페이지 상단에 @TRANSACTION 지시문을 추가하여 ASP 페이지를 트랜잭션 페이지로 선언해야 합니다.
@TRANSACTION 지시문은 페이지의 첫 번째 줄에 있어야 합니다. 그렇지 않으면 오류가 생성됩니다. 페이지의 ASP 스크립트 처리가 끝나면 현재 트랜잭션이 종료됩니다.
<%@ TRANSACTION=필수 언어=
VB스크립트%>
//트랜잭션 실행에 의해 이벤트가 성공적으로 트리거되었습니다.
<% 하위 OnTransactionCommit() %>
<% 응답.Redirect RegisterOk.html %>
<% 끝 하위 %>
//실행에 실패했을 때 발생하는 이벤트
<% 하위 OnTransactionAbort() %>
<% 응답.Redirect RegisterFail.html %>
<% 끝 하위 %>
<% sqlText="USER(userName,userPasswd) 값에 삽입('" %>
<% sqlText=sqlText & request("usrName") & "','" &request("usrPasswd")&"') " %>
<% conn.execute(sqlText) %>
<% if conn.Errors.Count>0이면 %>
<% 연결.오류.지우기 %>
<% ObjectContext.SetAbort %>
<%는 %인 경우 종료>
<% sqlText="USERDOC(사용자 이름, 나이, 성별, 전화번호, 주소)에 삽입 "%>
<% sqlText=sqlText & "values('" & request("usrName")& "', " & request("Age") %>
<% sqlText=sqlText & ",'" & 요청("PhoneNum") & "','" %>
<% sqlText=sqlText & request("주소") & "') " %>
<% conn.execute(sqlText) %>
<% if conn.Errors.Count>0이면 %>
<% 연결.오류.지우기 %>
<% ObjectContext.SetAbort %>
<%는 %인 경우 종료>
<% ObjectContext.SetComplete %>
이 솔루션은 더욱 유연합니다. ASP 데이터베이스 구성 요소를 사용하는 방법에는 몇 가지 장점이 있습니다. ADO 데이터베이스 구성 요소를 사용하여 트랜잭션 처리를 완료할 수 있으며 실제 요구 사항에 따라 자체 데이터베이스 구성 요소를 사용자 정의할 수도 있습니다(ASP 구성 요소를 충족하는 한). 스펙 작성) 가능). 데이터베이스 트랜잭션 처리의 신뢰성을 고려한다면 데이터베이스 내부에 트랜잭션 처리 저장 프로시저를 사용하는 것이 더 좋다. 이러한 방식으로 데이터베이스 트랜잭션 메커니즘을 직접 사용하여 애플리케이션의 논리적 트랜잭션 처리를 완료할 수 있으며 이는 안전하고 신뢰할 수 있으며 웹 서버와 데이터베이스 서버 간의 데이터 상호 작용을 줄입니다. 이는 분산 데이터베이스 시스템에 특히 중요합니다. MTS 컴포넌트를 이용한 트랜잭션 처리 방식의 장점은 컴포넌트(MTS에 등록된 컴포넌트) 작업의 완료 및 취소를 MTS 서버가 직접 제어하고 관리한다는 점이다. 확장 공간이 좋고 활용 가능성이 높으며 기술을 최대한 활용할 수 있다. MTS의 장점은 네트워크 응용 프로그램의 내결함성 성능을 향상시키고 IIS 웹 서버의 동적 성능을 향상시킵니다.