2012-03-02 32 views
42

Danh sách các câu lệnh nào cần phải được cam kết trước khi thực hiện thêm hành động trên bàn để tránh bị khóa? Tôi không nói về các giao dịch đầy đủ với nhiều câu lệnh và tính toàn vẹn giao dịch (thay vào đó tôi đang đề cập đến các câu lệnh đơn).oracle - những tuyên bố cần phải được cam kết?

Tôi biết chèn phải được cam kết nhưng cắt bớt có một autocommit. Danh sách đầy đủ các báo cáo cần phải cam kết là gì?

Cần được cam kết (danh sách khởi động):

UPDATE 
INSERT 
DELETE 
+1

'truncate' xóa dữ liệu trực tiếp mà không cần sao chép dữ liệu vào Vùng bảng quay vòng. Là một tuyên bố DDL. – danihp

+2

DCL có phải được đính kèm không? tức là cấp + thu hồi – toop

+0

Hợp nhất. Cũng chọn để cập nhật mất khóa, mặc dù nó không sửa đổi bất cứ điều gì. –

Trả lời

40

Lệnh DML (Ngôn ngữ thao tác dữ liệu) need to be được cam kết/cuộn lại. Here là danh sách các lệnh đó.

Báo cáo Ngôn ngữ thao tác dữ liệu (DML) được sử dụng để quản lý dữ liệu trong các đối tượng lược đồ. Một số ví dụ:

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

bạn có phải cam kết sau khi CHỌN HOẶC GIẢI THÍCH KẾ HOẠCH? – toop

+1

@toop Sau một 'CHỌN ... CHO CẬP NHẬT', bạn phải giải phóng khóa. –

+1

lựa chọn để cập nhật trông như thế nào? Ngoài ra làm thế nào về chỉ là một tiêu chuẩn lựa chọn * từ bảng nơi blah? – toop

4

DML phải được cam kết hoặc rollbacked. DDL không thể.

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

Bạn có thể chuyển tự động cam kết và lại chỉ dành cho DML. DDL không bao giờ là một phần của giao dịch và do đó không có gì giống như một cam kết/rollback rõ ràng.

truncate là DDL và do đó được cam kết hoàn toàn.

Chỉnh sửa
Tôi đã nói xin lỗi. Giống như @DCookie và @APC đã nêu trong các nhận xét có tồn tại sth như cam kết ngầm định cho DDL. Xem ở đây để biết câu hỏi về điều đó trên Ask Tom. Điều này trái ngược với những gì tôi đã học được và tôi vẫn còn hơi tò mò.

+1

bạn có phải cam kết sau khi CHỌN HOẶC GIẢI THÍCH KẾ HOẠCH? – toop

+0

Điều này là không chính xác về mặt kỹ thuật: DDL luôn đưa ra các cam kết và thực tế họ phát hành 2 trong số đó, lúc bắt đầu và ở cuối quá trình. Nếu bạn phát hành một tuyên bố DML, sau đó phát hành DDL, DML của bạn được cam kết. – DCookie

+2

-1. Tất nhiên DDL được cam kết. DDL cơ bản là phát hành các thay đổi cho từ điển dữ liệu, mà phải cam kết để chúng có thể được áp dụng. Sự khác biệt chỉ đơn giản là các cam kết là ngầm, và như DCookie nói, có hai trong số chúng. Vì vậy, nếu chúng ta phát hành một bản cập nhật trên một bảng và sau đó thực hiện một câu lệnh DDL không thành công, chúng tôi không thể khôi phục bản cập nhật. Nó đã được cam kết mặc dù DDL tiếp theo không được áp dụng. – APC

8

Về cơ học, COMMIT thực hiện giao dịch. Nghĩa là, một giao dịch là tất cả hoạt động (một hoặc nhiều câu lệnh DML) xảy ra giữa hai câu lệnh COMMIT (hoặc ROLLBACK).

Trong Oracle một tuyên bố DDL là một giao dịch theo đúng nghĩa của nó đơn giản chỉ vì một COMMIT tiềm ẩn được phát hành trước khi câu lệnh được thực hiện và một lần nữa sau đó.

Từ góc độ thiết kế hệ thống, giao dịch là đơn vị kinh doanh của công việc. Nó có thể bao gồm một tuyên bố DML đơn lẻ hoặc một vài trong số chúng. Nó không quan trọng: chỉ có giao dịch đầy đủ yêu cầu COMMIT. Nó theo nghĩa đen không có ý nghĩa để ban hành một COMMIT trừ khi hoặc cho đến khi chúng tôi đã hoàn thành một đơn vị kinh doanh toàn bộ công việc.

Đây là một khái niệm then chốt. COMMIT không chỉ giải phóng khóa. Trong Oracle họ cũng phát hành chốt, chẳng hạn như danh sách giao dịch quan tâm. Điều này có tác động vì mô hình nhất quán của Oracle đọc. Các ngoại lệ như ORA-01555: SNAPSHOT TOO OLD hoặc ORA-01002: FETCH OUT OF SEQUENCE xảy ra do các cam kết không phù hợp. Do đó, nó là rất quan trọng cho các giao dịch của chúng tôi để treo vào ổ khóa cho miễn là họ cần chúng.

1

Và một điểm quan trọng - mặc dù TRUNCATE TABLE có vẻ như một DELETE không có mệnh đề WHERE, TRUNCATE không phải là DML, nó là DDL. DELETE yêu cầu một COMMIT, nhưng TRUNCATE thì không.

Các vấn đề liên quan