今天在oracle的SQL plus 中執行了刪除和查詢操作,然後在PL/SQL中也執行查詢操作,語句一樣,結果卻不一樣,讓我大感鬱悶,後來才突然想到可能是兩邊資料不一致造成的,但是為什麼不一致呢,就是沒用commit,
在網上查了一下,大概是這樣說的:
DML語言,比如update,delete,insert等修改表中資料的需要commit;
DDL語言,比如create,drop等改變表結構的,就不需要寫commit(因為內部隱藏了commit);
DDL 資料定義語言 (Data Definition Language):
create table 建立表
alter table 修改表
drop table 刪除表
truncate table 刪除表中所有行
create index 建立索引
drop index 刪除索引
當執行DDL語句時,在每一條語句前後,oracle都將提交當前的事務。如果使用者使用insert命令將記錄插入到資料庫後,執行了一條DDL語句(如create
table),此時來自insert命令的資料將被提交到資料庫。當DDL語句執行完成時,DDL語句會被自動認可,不能復原。
DML 資料操作語言:
insert 將記錄插入到資料庫
update 修改資料庫的記錄
delete 刪除資料庫的記錄
當執行DML命令如果沒有提交,將不會被其他會話看到。除非在DML命令之後執行了DDL命令或DCL命令,或使用者退出會話,或終止執行個體,此時系統會自動
發出commit命令,使未提交的DML命令提交。
DDL :
Data Definition Language (DDL) statements are used to define the database structure or schema. Some examples:
CREATE - to create objects in the database
ALTER - alters the structure of the database
DROP - delete objects from the database
TRUNCATE - remove all records from a table, including all spaces allocated for the records are removed
COMMENT - add comments to the data dictionary
RENAME - rename an object
DML:
Data Manipulation Language (DML) statements are used for managing data within schema objects. Some examples:
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
DCL
Data Control Language (DCL) statements. Some examples:
GRANT - gives user's access privileges to database
REVOKE - withdraw access privileges given with the GRANT command
TCL
Transaction Control (TCL) statements are used to manage the changes made by DML statements. It allows statements to be grouped together into logical transactions.
COMMIT - save work done
SAVEPOINT - identify a point in a transaction to which you can later roll back
ROLLBACK - restore database to original since the last COMMIT
SET TRANSACTION - Change transaction options like isolation level and what rollback segment to use
鎖概念基礎
資料庫是一個多使用者使用的共用資源。當多個使用者並發地存取資料時,在資料庫中就會產生多個事務同時存取同一資料的情況。若對並行作業不加控制就可能會讀取和儲存不正確的資料,破壞資料庫的一致性。
加鎖是實現資料庫並發控制的一個非常重要的技術。當事務在對某個資料對象進行操作前,先向系統發出請求,對其加鎖。加鎖後事務就對該資料對象有了一定的控制,在該事務釋放鎖之前,其他的事務不能對此資料對象進行更新操作。
在資料庫中有兩種基本的鎖類型:排它鎖(Exclusive Locks,即X鎖)和共用鎖定(Share Locks,即S鎖)。當資料對象被加上排它鎖時,其他的事務不能對它讀取和修改。加了共用鎖定的資料對象可以被其他事務讀取,但不能修改。資料庫利用這兩種基本的鎖類型來對資料庫的事務進行並發控制。
Oracle資料庫的鎖類型
根據保護的對象不同,Oracle資料庫鎖可以分為以下幾大類:DML鎖(data locks,資料鎖),用於保護資料的完整性;DDL鎖(dictionary locks,字典鎖),用於保護資料庫物件的結構,如表、索引等的結構定義;內部鎖和閂(internal locks and latches),保護資料庫的內部結構。
DML鎖的目的在於保證並發情況下的資料完整性,。在Oracle資料庫中,DML鎖主要包括TM鎖和TX鎖,其中TM鎖稱為表級鎖,TX鎖稱為事務鎖或行級鎖。
當Oracle 執行DML語句時,系統自動在所要操作的表上申請TM類型的鎖。當TM鎖獲得後,系統再自動申請TX類型的鎖,並將實際鎖定的資料行的鎖標誌位進行置位。這樣在事務加鎖前檢查TX鎖相容性時就不用再逐行檢查鎖標誌,而只需檢查TM鎖模式的相容性即可,大大提高了系統的效率。TM鎖包括了SS、SX、S、X 等多種模式,在資料庫中用0-6來表示。不同的SQL操作產生不同類型的TM鎖。
在資料行上只有X鎖(獨佔鎖定)。在 Oracle資料庫中,當一個事務首次發起一個DML語句時就獲得一個TX鎖,該鎖保持到事務被提交或復原。當兩個或多個會話在表的同一條記錄上執行 DML語句時,第一個會話在該條記錄上加鎖,其他的會話處於等待狀態。當第一個會話提交後,TX鎖被釋放,其他會話才可以加鎖。
當Oracle資料庫發生TX鎖等待時,如果不及時處理常常會引起Oracle資料庫掛起,或導致死結的發生,產生ORA-60的錯誤。這些現象都會對實際應用產生極大的危害,如長時間未響應,大量事務失敗等。