Oracle 업데이트가 중지됨
Oracle 업데이트에 문제가 있습니다.ExecuteNonQuery에 대한 호출이 무기한 중단됩니다.
코드:
using (OracleCommand cmd = new OracleCommand(dbData.SqlCommandStr, conn))
{
foreach (string colName in dbData.Values.Keys)
cmd.Parameters.Add(colName, dbData.Values[colName]);
cmd.CommandTimeout = txTimeout;
int nRowsAffected = cmd.ExecuteNonQuery();
}
CommandTimeout이 5로 설정되어 있고, 파라미터가 작은 정수 값으로 설정되어 있습니다.
질문:
UPDATE "BEN"."TABLE03" SET "COLUMN03"=:1,"COLUMN04"=:2 WHERE COLUMN05 > 0
쿼리는 sqlplus에서 빠르게 실행되고 보통 내 코드에서 빠르게 실행되지만 가끔 영구적으로 중단됩니다.
v$locked_object에 대한 쿼리를 실행했는데 이 테이블을 참조한 레코드가 하나 있는데 업데이트가 완료되지 않은 것 같습니다.
알고 싶은 것은 두 가지입니다.업데이트가 중단되는 원인은 무엇입니까?
더 중요한 것은 왜 여기서 예외를 두지 않는 것일까요?통화가 5초 정도 기다리다가 시간이 초과될 것으로 예상됩니다.
검색 결과의 페이지 순위 때문에 이것과 부딪힙니다.
저의 경우 SqlPlus에서 쿼리를 실행했는데 커밋하는 것을 잊어버렸기 때문입니다.이 경우에는 빈센트가 말한 대로였습니다. 그 행은 다른 세션에서 잠겼습니다.
SqlPlus 업데이트를 커밋하면 문제가 해결되었습니다.
간단한 업데이트가 실행되면 다른 세션에 의해 차단되는 경우가 많습니다.Oracle은 두 개 이상의 트랜잭션이 행을 업데이트하는 것을 허용하지 않습니다.트랜잭션이 수정 사항을 커밋하거나 롤백할 때까지 업데이트/삭제한 행을 잠급니다.이것은 다른 세션이 동일한 행을 수정하려면 기다려야 함을 의미합니다.
무기한으로 중단하지 않으려면 업데이트 전에 업데이트할 ...을 선택해야 합니다.
Sql 명령이 커밋되지 않아 발생한 문제와 유사한 문제가 있었습니다. 프로그램이 어느 시점에서 충돌한 것 같습니다.
문제를 해결한 방법은 다음과 같습니다.
먼저 SqlPlus를 열고 커밋을 수행하여 문제를 해결합니다.
다음으로 예외가 발생할 경우 트랜잭션을 커밋하거나 롤백하도록 코드를 변경합니다.그러면 문제가 다시 발생하는 것을 막을 수 있습니다.
코드를 다음과 같이 변경할 수 있습니다.
using (OracleTransaction transaction = conn.BeginTransaction())
{
using (OracleCommand cmd = new OracleCommand(dbData.SqlCommandStr, conn))
{
foreach (string colName in dbData.Values.Keys)
cmd.Parameters.Add(colName, dbData.Values[colName]);
cmd.CommandTimeout = txTimeout;
try
{
int nRowsAffected = cmd.ExecuteNonQuery();
transaction.Commit();
}
catch
{
transaction.Rollback();
}
}
}
V$SESSION_WAIT(세션의 SID를 식별한 후, 아마도 V$SESSION을 확인함)를 쿼리하여 세션이 대기 중인 이벤트를 확인할 수 있습니다.이벤트가 "대기열"과 같은 것이라면 다른 세션이 보유한 잠금 상태에서 대기하는 것이며, 이 경우에는 가능한 설명으로 보입니다.
저는 이 문제에 자주 부딪혀 왔고, 단순히 쿼리를 업데이트하는 것 이상의 것을 가지고 있습니다(특히 "INSERT INTO...").SELECT FROM" 쿼리).이것은 오라클 9i에 있습니다.
해결책을 찾았기 때문에 다음과 같은 관련 SO 주제를 찾기로 결정했습니다.연결 문자열에서 다음을 설정합니다.
Pooling=False
연결 문자열에 포함됩니다.전체 작동 연결 문자열은 다음과 같습니다.
DATA SOURCE=k19.MYDOMAIN.com/plldb;PERSIST SECURITY INFO=True;Pooling=False;USER ID=IT;Password=SECRET
주의 사항:풀링을 false로 설정하면 쿼리를 실행할 때마다 새 연결을 확보해야 합니다.매우 자주 실행되는 쿼리는 ODP의 경우보다 성능이 저하될 수 있습니다.NET은 신뢰할 수 있었습니다.하지만 문제를 생각하면, 매달리는 것보다는 조금 더 천천히 달리는 것이 훨씬 낫습니다.
데이터베이스가 커밋/잠금을 기다리는 것 같아서 행을 잠급니다.추가하는 것을 제안합니다.
int nRowsAffected = cmd.ExecuteNonQuery();
cmd.Commit();
언급URL : https://stackoverflow.com/questions/1172378/oracle-update-hangs
'programing' 카테고리의 다른 글
MVC, C# 및 jQuery를 사용하여 CSV로 내보내기 (0) | 2023.09.17 |
---|---|
도커 이미지를 개인 저장소로 푸시하는 방법 (0) | 2023.09.17 |
AppDelegate 인스턴스 변수 참조 (0) | 2023.09.12 |
Oracle SQL - 열의 값을 기준으로 문자를 반복하는 방법 (0) | 2023.09.12 |
드롭다운 메뉴에 옵션이 몇 개 있는지 확인하려면 어떻게 해야 합니까? (0) | 2023.09.12 |