환경은 윈도우2000+오라클9i 를 사용 중이구요.
문제는 Select 할때는 잘 가져 오는데
Insert / Delete SQL문을 실행 하면
"시간초과: 분산 트랜잭션이 잠금으로 대기중 입니다" 라는 에러가
발생하네요.
COM+를 몰라서 어떻게 해결 해야 할지 난감한 상태입니다.
고수분들의 조언 부탁 드립니다.^^
이 부분은 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...
하나의 요청일 때에도 그러나요? 아니면 여러개의 요청이 몰렸을 때 그러나요?
--
======= (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();
> }
> }
http://asktom.oracle.com/pls/ask/f?p=4950:8:::::F4950_P8_DISPLAYID:2106879111815
해당 DeadLock에 대한 troubleshooting을 하는 것이 좋을 듯 합니다.
아주 기본적인 얘기구요,
또한 Transaction을 사용하시는 데, 명시적으로 또는 암시적으로 Transaction을 scoping 할 필요가 있을 듯 합니다.
코드에서 말이죠, SetComplete/SetAbort 또는 AutoComplete 를 사용하는 것을 말합니다. 이미 사용중이시라면,
물론, 다행이구요..
"취생몽사"님이 작성한 내용: