今天oracle的SQL plus 運(yùn)行該刪除和查詢操作,然后PL/SQL還運(yùn)行查詢。相同的句子,結(jié)果是不一樣的。我郁悶很大,然后,突然想到這可能對雙方造成由數(shù)據(jù)不一致,為什么不一致呢。就是沒用commit,
在網(wǎng)上查了一下,大概是這樣說的:
DML語言,比方update,delete,insert等改動表中數(shù)據(jù)的須要commit;
DDL語言,比方create,drop等改變表結(jié)構(gòu)的。就不須要寫commit(由于內(nèi)部隱藏了commit);
DDL 數(shù)據(jù)定義語言:
create table 創(chuàng)建表 ?
alter table 改動表 ?
drop table 刪除表 ?
truncate table 刪除表中全部行 ?
create index 創(chuàng)建索引 ?
drop index 刪除索引
當(dāng)運(yùn)行DDL語句時,在每一條語句前后,oracle都將提交當(dāng)前的事務(wù)。
假設(shè)用戶使用insert命令將記錄插入到數(shù)據(jù)庫后,運(yùn)行了一條DDL語句(如create
table)。此時來自insert命令的數(shù)據(jù)將被提交到數(shù)據(jù)庫。當(dāng)DDL語句運(yùn)行完畢時,DDL語句會被自己主動提交,不能回滾。
DML 數(shù)據(jù)操作語言:
insert 將記錄插入到數(shù)據(jù)庫?
update 改動數(shù)據(jù)庫的記錄?
delete 刪除數(shù)據(jù)庫的記錄
當(dāng)運(yùn)行DML命令假設(shè)沒有提交,將不會被其它會話看到。
除非在DML命令之后運(yùn)行了DDL命令或DCL命令,或用戶退出會話。或終止實例,此時系統(tǒng)會自己主動
發(fā)出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
鎖概念基礎(chǔ)
數(shù)據(jù)庫是一個多用戶使用的共享資源。
當(dāng)多個用戶并發(fā)地存取數(shù)據(jù)時,在數(shù)據(jù)庫中就會產(chǎn)生多個事務(wù)同一時候存取同一數(shù)據(jù)的情況。若對并發(fā)操作不加控制就可能會讀取和存儲不對的數(shù)據(jù),破壞數(shù)據(jù)庫的一致性。
加鎖是實現(xiàn)數(shù)據(jù)庫并發(fā)控制的一個很重要的技術(shù)。當(dāng)事務(wù)在對某個數(shù)據(jù)對象進(jìn)行操作前,先向系統(tǒng)發(fā)出請求。對其加鎖。加鎖后事務(wù)就對該數(shù)據(jù)對象有了一定的控制,在該事務(wù)釋放鎖之前,其它的事務(wù)不能對此數(shù)據(jù)對象進(jìn)行更新操作。
在數(shù)據(jù)庫中有兩種主要的鎖類型:排它鎖(Exclusive Locks。即X鎖)和共享鎖(Share Locks,即S鎖)。
當(dāng)數(shù)據(jù)對象被加上排它鎖時。其它的事務(wù)不能對它讀取和改動。
加了共享鎖的數(shù)據(jù)對象能夠被其它事務(wù)讀取,但不能改動。數(shù)據(jù)庫利用這兩種主要的鎖類型來對數(shù)據(jù)庫的事務(wù)進(jìn)行并發(fā)控制。
Oracle數(shù)據(jù)庫的鎖類型
依據(jù)保護(hù)的對象不同,Oracle數(shù)據(jù)庫鎖能夠分為下面幾大類:DML鎖(data locks,數(shù)據(jù)鎖),用于保護(hù)數(shù)據(jù)的完整性。DDL鎖(dictionary locks,字典鎖),用于保護(hù)數(shù)據(jù)庫對象的結(jié)構(gòu),如表、索引等的結(jié)構(gòu)定義。內(nèi)部鎖和閂(internal locks and latches)。保護(hù)數(shù)據(jù)庫的內(nèi)部結(jié)構(gòu)。
DML鎖的目的在于保證并發(fā)情況下的數(shù)據(jù)完整性,。
在Oracle數(shù)據(jù)庫中,DML鎖主要包含TM鎖和TX鎖,當(dāng)中TM鎖稱為表級鎖,TX鎖稱為事務(wù)鎖或行級鎖。
當(dāng)Oracle 運(yùn)行DML語句時,系統(tǒng)自己主動在所要操作的表上申請TM類型的鎖。當(dāng)TM鎖獲得后。系統(tǒng)再自己主動申請TX類型的鎖。并將實際鎖定的數(shù)據(jù)行的鎖標(biāo)志位進(jìn)行置位。
這樣在事務(wù)加鎖前檢查TX鎖相容性時就不用再逐行檢查鎖標(biāo)志。而僅僅需檢查TM鎖模式的相容性就可以,大大提高了系統(tǒng)的效率。TM鎖包含了SS、SX、S、X 等多種模式。在數(shù)據(jù)庫中用0-6來表示。
不同的SQL操作產(chǎn)生不同類型的TM鎖。
在數(shù)據(jù)行上僅僅有X鎖(排他鎖)。在 Oracle數(shù)據(jù)庫中。當(dāng)一個事務(wù)首次發(fā)起一個DML語句時就獲得一個TX鎖。該鎖保持到事務(wù)被提交或回滾。當(dāng)兩個或多個會話在表的同一條記錄上運(yùn)行 DML語句時,第一屆會議在此記錄鎖定,處于觀望狀態(tài)的其他會話。
當(dāng)?shù)谝粚脮h提交,TX鎖定被解除,其他場次足夠的天賦鎖定。
什么時候Oracle數(shù)據(jù)庫發(fā)生TX鎖等待,假設(shè)沒有及時治療常導(dǎo)致Oracle數(shù)據(jù)庫掛起,或?qū)е滤梨i的發(fā)生。生產(chǎn)ORA-60錯誤。這些現(xiàn)象將在面臨嚴(yán)重風(fēng)險的實際應(yīng)用。由于長時間沒有回應(yīng)。大量的交易失敗,等等。。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
