Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

시간초과: 분산 트랜잭션이 잠 금으로 대기중 입니다..에러 해결 방법좀 알려 주세요

706 views
Skip to first unread message

취생몽사

unread,
Jan 20, 2005, 12:33:01 AM1/20/05
to
데이터 레이어를 따로 떼서 Com+에 올리는 형태로 개발 중입니다.

환경은 윈도우2000+오라클9i 를 사용 중이구요.

문제는 Select 할때는 잘 가져 오는데
Insert / Delete SQL문을 실행 하면
"시간초과: 분산 트랜잭션이 잠금으로 대기중 입니다" 라는 에러가
발생하네요.

COM+를 몰라서 어떻게 해결 해야 할지 난감한 상태입니다.
고수분들의 조언 부탁 드립니다.^^

정성태

unread,
Jan 20, 2005, 2:06:15 AM1/20/05
to
제한된 정보로는, ... 어떻게 더 말씀드릴 것이 없군요.
오류상으로 봤을 때는, DTC 가 시간초과 되는 상황을 만난 것 같은데.
그렇다면 트랜잭션 문제에서, Lock 이 걸리는 것인지 점검하시고요.

이 부분은 COM+ 문제라기 보다는 DTC 문제입니다.
허긴... 어차피 COM+ 자체가 DTC 를 사용하긴 하지만, 그 오류는 ASP 페이지
등에서도 DTC 사용으로 설정하면 발생할 것입니다.

--
======= (c) .NETXpert ==========
url : http://www.dotnetxpert.com
eml : ke...@dotnetxpert.com
msn: kevi...@magicn.com

MCSD.NET, MVP[VC++]
==============================
"취생몽사" <????@discussions.microsoft.com> wrote in message
news:AB110ED2-27C3-452D...@microsoft.com...

정성태

unread,
Jan 20, 2005, 7:59:50 AM1/20/05
to
가끔 그러나요?
아니면 무조건 그러나요? 무조건 그렇다면, i == 0 일 때 부터 그러나요? 아니면
중간부터 그러나요?

하나의 요청일 때에도 그러나요? 아니면 여러개의 요청이 몰렸을 때 그러나요?


--
======= (c) .NETXpert ==========
url : http://www.dotnetxpert.com
eml : ke...@dotnetxpert.com
msn: kevi...@magicn.com

MCSD.NET, MVP[VC++]
==============================
"취생몽사" <@discussions.microsoft.com> wrote in message
news:C6450CD4-7E92-4848...@microsoft.com...
> 현재 문제가 되는 로직은
> 테이블에 기존 데이터가 있으면 해당 내용을 업데이트 하고
> 기존 데이터가 없는 경우 인서트 문을 실행 시키는데,
> 이 작업을 여러번(1~10번 정도) 수행 하는 것입니다.
>
> 일단 SELECT COUNT(*) 형태로 쿼리를 수행하는 메소드가 별도로 있고
> 여기서 카운트 값을 리턴해서 해당 메소드에서 Insert/Update 문을
실행합니다.
> 이때 Insert/Update 쿼리를 던지는 ExecuteNonQuery() 에서
> 에러가 발생 합니다.
>
> 처음에 SELECT 실행은 ExecuteScalar() 형태로 던지기 때문에
> 문제가 없을꺼 같은데 Lock 문제가 발생 하네요...
>
> [Transaction(TransactionOption.Required)]
> public class NG20002_Rtx : ServicedComponent
> {
> public void Method_A(......)
> {
> OracleDbManager dm = new OracleDbManager();
> try{
> string exeSQL = "";
> for(int i=0; i< dt.Rows.Count ; i++)
> {
> int rtnCount = Int32.Parse(this.MethodB(......));
> if(rtnCount > 0)
> {
> string SQL = "UPDATE......"; dm.ExecuteNonQuery(SQL);
> }
> else
> {
> string SQL = "INSERT
> ....."; dm.ExecuteNonQuery(SQL);
> }
> }
> }
> catch(Exception ex)
> {
> .............
> }
> finally
> {
> dm.Dispose();
> }
> }
>
>
> public string MethodB(....)
> {
> OracleDbManager dm = new OracleDbManager();
> try
> {
> string rtnCount = dm.ExecuteScalar(SQL)+"";
> return rtnCount;
> }
> catch(Exception ex)
> {
> .....
> }
> finally
> {
> dm.Dispose();
> }
> }


byung

unread,
Dec 1, 2005, 10:02:02 PM12/1/05
to
DeadLock Issue로 보입니다.
----
ORA-02049: time-out: distributed transaction waiting for lock
Cause: The time to wait on a lock in a distributed transaction has been
exceeded. This time is specified in the initialization parameter
DISTRIBUTED_LOCK_TIMEOUT.
Action: This situation is treated as a deadlock and the statement was rolled
back. To set the time-out interval to a longer interval, adjust the
initialization parameter DISTRIBUTED_LOCK_TIMEOUT, then shut down and restart
the instance.
----
다음의 Link를 참조하시는 것이 좋을 듯 하고요,

http://asktom.oracle.com/pls/ask/f?p=4950:8:::::F4950_P8_DISPLAYID:2106879111815

해당 DeadLock에 대한 troubleshooting을 하는 것이 좋을 듯 합니다.
아주 기본적인 얘기구요,
또한 Transaction을 사용하시는 데, 명시적으로 또는 암시적으로 Transaction을 scoping 할 필요가 있을 듯 합니다.
코드에서 말이죠, SetComplete/SetAbort 또는 AutoComplete 를 사용하는 것을 말합니다. 이미 사용중이시라면,
물론, 다행이구요..

"취생몽사"님이 작성한 내용:

0 new messages