지난번 웹서비스에서 트랜잭션 처리 문제를 겪었기 때문에, 프로그램을 디버깅하던 중 우연히 OracleConnection의 연결 문자열 참여 설정에 대해 흥미로운 사실을 발견했습니다.
이전에 기사를 읽었는데 내용이 기억나지 않습니다. 기사에서는 입대를 false로 설정하는 것이 가장 좋다고 했습니다. 당시에는 false로 설정해야 하는 이유에 대해 자세히 설명하지 않았습니다. 내 프로그램 enlist=false가 직접 작성되었습니다. 이제서야 입대 설정과 거래 처리 사이에 미묘한 관계가 있다는 사실을 발견했습니다.
트랜잭션 관리자는 일반적으로 두 가지 관리 방법을 사용합니다. 하나는 LTM이라고 하는 Lightweight Transaction Management이고 다른 하나는 oleX TM입니다. 단순 단계 제출에서는 LTM이 일반적으로 사용되는 반면, 분산 트랜잭션 처리에서는 2PC가 일반적으로 사용되므로 사용되는 방법은 oleX TM입니다.
enlist=false인 경우 후속 트랜잭션이 현재 트랜잭션에 등록되지 않으므로 현재 트랜잭션이 트랜잭션의 루트가 되지 않음을 의미합니다. 프로그램에서 분산 트랜잭션 처리를 사용하는 경우 올바르게 실행되지 않을 수 있습니다(테스트해 보지 않았습니다). 이때 프로그램은 TM에게 LTM을 사용하여 관리하라고 지시합니다.
enlist=true인 경우 프로세스는 oleX TM을 사용하여 관리해야 한다고 TM에 알립니다. 이때 분산 트랜잭션 관리가 자동으로 활성화되므로 연결 문자열에 enlist=true가 설정된 경우 oracle 데이터베이스가 사용되는 경우 그러면 배경은 oramts.dll을 호출할 때 Oracle용 MTS 서비스가 개발 환경에 설치되지 않은 경우 oramts.dll을 찾을 수 없다는 메시지를 표시합니다. 이 서비스의 설치 패키지는 오라클 홈페이지에서 다운로드 받을 수 있습니다. 오라클에서는 왜 별도의 설치 패키지를 제공하지 않고 odac과 함께 번들로 다운로드합니다.
Enlist를 구성하지 않으면 어떻게 되나요? 이는 프로그램이 분산 트랜잭션을 사용하는지 아니면 일반 트랜잭션 처리를 사용하는지에 따라 달라집니다. TM은 프로그램의 요청에 따라 자동으로 반응합니다.
결론: Enlist는 거래 등록에 대해 특정 통제권을 갖습니다. 내 설명이 잘못된 경우 수정하도록 도와주세요.
링크 주소: http://yanrongpi.cnblogs.com/archive/2006/07/13/450189.html