2014-07-11 2 views
1

Oracle 데이터베이스 관리 시스템을 사용하고 있습니다. 표준 SQL 삽입 쿼리를 사용했습니다.테이블에 데이터를 삽입 한 후에는 새 데이터가 표시되지 않습니다. 왜?

삽입이 성공적이라도 새로 삽입 된 데이터가 테이블에 표시되지 않습니다. 컴퓨터를 다시 시작하고 응용 프로그램을 다시 열면 데이터가 표시됩니다.

이 문제를 해결하는 방법은 무엇입니까?

+4

'삽입'후에 '커밋'했습니까? – Jens

+0

질문에 sql-server라는 태그가 붙은 이유는 무엇입니까? – Raj

답변

2

삽입 후 COMMIT을 사용해야합니다.

COMMIT 문을 사용하여 현재 트랜잭션을 종료하고 트랜잭션에서 수행 된 모든 변경 사항을 영구 보존하십시오. 트랜잭션은 Oracle Database가 단일 단위로 취급하는 일련의 SQL 문입니다. 또한이 명령문은 트랜잭션의 모든 세이브 포인트를 지우고 트랜잭션 잠금을 해제합니다.

일시적 수정 된 테이블을 쿼리하여 당신이 세션에서 트랜잭션 동안 변경 사항을 볼 수 있지만 다른 사용자가 변경 내용을 볼 수 없습니다 : 당신이 트랜잭션을 커밋까지

. 트랜잭션을 커밋 한 후에 변경 내용은 커밋 이후에 실행되는 다른 사용자의 명령문에서 볼 수 있습니다.

당신은

모범 사례가 문을 수정마다 업데이트를 만든 후, COMMIT;을 사용하여 삭제하는 것입니다 롤백 statemen와 거래하는 동안 변경 사항을 롤백 (취소) 할 수 있습니다.

+2

나는 모든 "생성, 업데이트, 삭제, 수정 후에 COMMIT를 사용하는 것이 가장 좋습니다"라는 것에 대해서는 동의하지 않습니다. 실제로 트랜잭션의 지점을 물리 치기 때문에 많은 상황에서 약간 위험합니다. – codenheim

+0

@mrjoltcola : 세션 종료시, 그러한 진술이 사용되면 커밋되어야합니다 !! 내 대답은 적절하게 편집 할 수 있습니다. –

+0

고맙습니다. 그것은 효과가 있었다. – user3728385

1

귀하의 작업을 커밋하십시오. 세션 A가 트랜잭션을 커밋하기 전에 세션 A로 삽입하고 세션 B (다른 창)를 쿼리했을 가능성이 있습니다. 오라클은 다른 세션에 커밋되지 않은 변경 사항을 표시하지 않습니다.

오라클은 DIRTY READS를 허용하거나 지원하지 않습니다. Oracle의 READ UNCOMMITTED 격리 수준은 SQL Server와 같은 구현을 따르지 않습니다. 커밋 될 때까지 수행 된 세션 (트랜잭션)의 변경 사항 만 표시됩니다.

삽입 한 동일한 세션의 데이터를 쿼리 한 경우 데이터를 보았을 것입니다. 오라클을 처음 접한다면 MVCC (Multi-Version Concurrency Control)와 다른 데이터베이스 아키텍처와의 차이점을 이해해야합니다.

왜 재부팅 후 데이터를 보았습니까? 당신은 당신이 사용한 "응용"을 언급하지 않았습니다. 예를 들어 SQLPlus를 종료하면 자동 커밋됩니다. 각 문이 자동 커밋되기를 원한다면 "SET AUTOCOMMIT ON"을 사용할 수 있지만, ROLLBACK을 사용하여 잘못된 변경을 되돌릴 수 없기 때문에 약간 위험 할 수 있습니다.

관련 문제