2012-03-02 3 views
42

잠금을 피하기 위해 테이블에서 추가 작업을 수행하기 전에 커밋해야하는 명령문 목록은 무엇입니까? 나는 여러 문장들과 트랜잭션 무결성을 가진 완전한 트랜잭션에 대해서 말하고있는 것이 아니다. (대신 하나의 문장을 언급하고있다.)oracle - 어떤 문장을 커밋해야합니까?

삽입이 커밋되어야하지만 잘라내기에 자동 커밋이 있다는 것을 알고 있습니다. 저지되어야하는 전체 진술 목록은 무엇입니까?

필요는 (스타터 목록) 최선을 다하고있다 :

UPDATE 
INSERT 
DELETE 
+1

'truncate'는 데이터를 Rollback Tablespace에 복사하지 않고 직접 제거합니다. DDL 문입니다. – danihp

+2

DCL을 설치해야합니까? 즉 grant + revoke – toop

+0

Merge. 또한 업데이트를 선택하면 아무 것도 수정하지 않더라도 잠금이 적용됩니다. –

답변

40

DML (데이터 조작 언어) 명령 need to be 커밋되거나 롤백되었습니다. Here은 해당 명령 목록입니다.

DML (데이터 조작 언어) 문은 스키마 개체 내에서 데이터를 관리하는 데 사용됩니다. 몇 가지 예 : 기계적인 측면에서

SELECT - retrieve data from the a database 
INSERT - insert data into a table 
UPDATE - updates existing data within a table 
DELETE - deletes all records from a table, the space for the records remain 
MERGE - UPSERT operation (insert or update) 
CALL - call a PL/SQL or Java subprogram 
EXPLAIN PLAN - explain access path to data 
LOCK TABLE - control concurrency 
+2

SELECT 또는 EXPLAIN PLAN 후에 커밋해야합니까? – toop

+1

@toop'SELECT ... FOR UPDATE' 다음에는 잠금을 해제해야합니다. –

+1

업데이트 선택이 전체적으로 어떻게 생겼습니까? 또한 테이블에서 단지 표준 select *에 대해 어때? – toop

4

DML 커밋 또는 롤백 할 수 있습니다. DDL은 할 수 없습니다.

http://www.orafaq.com/faq/what_are_the_difference_between_ddl_dml_and_dcl_commands

당신에 자동 위탁 전환 할 수 그것은 단지 DML 다시입니다. DDL은 결코 트랜잭션의 일부가 아니므로 명시 적 확약/롤백과 같은 것은 없습니다.

truncate은 암시 적으로 커밋됩니다.


죄송합니다. @DCookie 및 @APC와 마찬가지로 주석에는 과 같은 sth가 있으며 DDL에는이 암시 적으로 커밋됩니다. 여기에 대한 내용은 Ask Tom에 관한 질문을 참조하십시오. 이것은 내가 배운 것과는 대조적이며 나는 아직도 약간 궁금하다.

+1

SELECT 또는 EXPLAIN PLAN 후에 커밋해야합니까? – toop

+0

이것은 기술적으로 올바르지 않습니다. DDL은 항상 커밋을 실행하고 실제로 프로세스의 시작과 끝에서 커밋을 실행합니다. DML 문을 발행 한 다음 DDL을 발행하면 DML이 확약됩니다. – DCookie

+2

-1. 물론 DDL이 커밋됩니다. DDL은 근본적으로 데이터 딕셔너리의 변경 사항을 발행하기 때문에 커밋해야 적용 할 수 있습니다. 차이점은 단순히 커밋이 암시 적이라는 것이고 DCookie 상태에는 두 가지가 있습니다. 따라서 테이블에서 업데이트를 실행 한 다음 실패한 DDL 문을 실행하면 업데이트를 롤백 할 수 없습니다. 후속 DDL이 적용되지 않아도 커밋되었습니다. – APC

8

는 COMMIT 트랜잭션을합니다. 즉, 트랜잭션은 두 COMMIT 문 (또는 ROLLBACK) 사이에서 발생하는 모든 활동 (하나 이상의 DML 문)입니다.

Oracle에서 DDL 문은 단순히 명령문이 실행되기 전에 암시 적 COMMIT이 발행되고 이후에 다시 실행되기 때문에 단순히 자체 트랜잭션입니다.

시스템 설계 관점에서 볼 때 트랜잭션은 업무 단위의 비즈니스 단위입니다. 단일 DML 문 또는 그 중 몇 개로 구성 될 수 있습니다. 중요하지 않습니다. 전체 트랜잭션 만 COMMIT해야합니다. 우리가 전체 업무 단위를 완료하지 않는 한, COMMIT를 발행하는 것은 사실상 의미가 없습니다.

이것은 중요한 개념입니다. 커밋은 잠금을 해제하지 않습니다. Oracle에서는 관심 트랜잭션 목록과 같은 래치를 릴리스합니다. 이는 오라클의 읽기 일관성 모델로 인해 영향을 미칩니다. 부적절한 커밋으로 인해 ORA-01555: SNAPSHOT TOO OLD 또는 ORA-01002: FETCH OUT OF SEQUENCE과 같은 예외가 발생합니다. 따라서 거래가 필요할 때만 잠금 장치에 매달리는 것이 중요합니다.

1

핵심 포인트 - TRUNCATE TABLE은 WHERE 절이없는 DELETE처럼 보이지만 TRUNCATE는 DML이 아니며 DDL입니다. DELETE는 COMMIT가 필요하지만 TRUNCATE는 필요하지 않습니다.

관련 문제