oracle什么时候需要commit
生活随笔
收集整理的這篇文章主要介紹了
oracle什么时候需要commit
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
今天在Oracle的SQL plus 中執(zhí)行了刪除和查詢操作,然后在PL/SQL中也執(zhí)行查詢操作,語句一樣,結(jié)果卻不一樣,讓我大感郁悶,后來才突然想到可能是兩邊數(shù)據(jù)不一致造成的,但是為什么不一致呢,就是沒用commit, 在網(wǎng)上查了一下,大概是這樣說的: DML語言,比如update,delete,insert等修改表中數(shù)據(jù)的需要commit; DDL語言,比如create,drop等改變表結(jié)構(gòu)的,就不需要寫commit(因?yàn)閮?nèi)部隱藏了commit); DDL 數(shù)據(jù)定義語言: create table 創(chuàng)建表 alter table 修改表 drop table 刪除表 truncate table 刪除表中所有行 create index 創(chuàng)建索引 drop index 刪除索引 當(dāng)執(zhí)行DDL語句時(shí),在每一條語句前后,oracle都將提交當(dāng)前的事務(wù)。如果用戶使用insert命令將記錄插入到數(shù)據(jù)庫后,執(zhí)行了一條DDL語句(如create table),此時(shí)來自insert命令的數(shù)據(jù)將被提交到數(shù)據(jù)庫。當(dāng)DDL語句執(zhí)行完成時(shí),DDL語句會(huì)被自動(dòng)提交,不能回滾。 DML 數(shù)據(jù)操作語言: insert 將記錄插入到數(shù)據(jù)庫 update 修改數(shù)據(jù)庫的記錄 delete 刪除數(shù)據(jù)庫的記錄 當(dāng)執(zhí)行DML命令如果沒有提交,將不會(huì)被其他會(huì)話看到。除非在DML命令之后執(zhí)行了DDL命令或DCL命令,或用戶退出會(huì)話,或終止實(shí)例,此時(shí)系統(tǒng)會(huì)自動(dò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ù)庫是一個(gè)多用戶使用的共享資源。當(dāng)多個(gè)用戶并發(fā)地存取數(shù)據(jù)時(shí),在數(shù)據(jù)庫中就會(huì)產(chǎn)生多個(gè)事務(wù)同時(shí)存取同一數(shù)據(jù)的情況。若對(duì)并發(fā)操作不加控制就可能會(huì)讀取和存儲(chǔ)不正確的數(shù)據(jù),破壞數(shù)據(jù)庫的一致性。 加鎖是實(shí)現(xiàn)數(shù)據(jù)庫并發(fā)控制的一個(gè)非常重要的技術(shù)。當(dāng)事務(wù)在對(duì)某個(gè)數(shù)據(jù)對(duì)象進(jìn)行操作前,先向系統(tǒng)發(fā)出請(qǐng)求,對(duì)其加鎖。加鎖后事務(wù)就對(duì)該數(shù)據(jù)對(duì)象有了一定的控制,在該事務(wù)釋放鎖之前,其他的事務(wù)不能對(duì)此數(shù)據(jù)對(duì)象進(jìn)行更新操作。 在數(shù)據(jù)庫中有兩種基本的鎖類型:排它鎖(Exclusive Locks,即X鎖)和共享鎖(Share Locks,即S鎖)。當(dāng)數(shù)據(jù)對(duì)象被加上排它鎖時(shí),其他的事務(wù)不能對(duì)它讀取和修改。加了共享鎖的數(shù)據(jù)對(duì)象可以被其他事務(wù)讀取,但不能修改。數(shù)據(jù)庫利用這兩種基本的鎖類型來對(duì)數(shù)據(jù)庫的事務(wù)進(jìn)行并發(fā)控制。 Oracle數(shù)據(jù)庫的鎖類型 根據(jù)保護(hù)的對(duì)象不同,Oracle數(shù)據(jù)庫鎖可以分為以下幾大類:DML鎖(data locks,數(shù)據(jù)鎖),用于保護(hù)數(shù)據(jù)的完整性;DDL鎖(dictionary locks,字典鎖),用于保護(hù)數(shù)據(jù)庫對(duì)象的結(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鎖,其中TM鎖稱為表級(jí)鎖,TX鎖稱為事務(wù)鎖或行級(jí)鎖。 當(dāng)Oracle 執(zhí)行DML語句時(shí),系統(tǒng)自動(dòng)在所要操作的表上申請(qǐng)TM類型的鎖。當(dāng)TM鎖獲得后,系統(tǒng)再自動(dòng)申請(qǐng)TX類型的鎖,并將實(shí)際鎖定的數(shù)據(jù)行的鎖標(biāo)志位進(jìn)行置位。這樣在事務(wù)加鎖前檢查TX鎖相容性時(shí)就不用再逐行檢查鎖標(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)一個(gè)事務(wù)首次發(fā)起一個(gè)DML語句時(shí)就獲得一個(gè)TX鎖,該鎖保持到事務(wù)被提交或回滾。當(dāng)兩個(gè)或多個(gè)會(huì)話在表的同一條記錄上執(zhí)行 DML語句時(shí),第一個(gè)會(huì)話在該條記錄上加鎖,其他的會(huì)話處于等待狀態(tài)。當(dāng)?shù)谝粋€(gè)會(huì)話提交后,TX鎖被釋放,其他會(huì)話才可以加鎖。 當(dāng)Oracle數(shù)據(jù)庫發(fā)生TX鎖等待時(shí),如果不及時(shí)處理常常會(huì)引起Oracle數(shù)據(jù)庫掛起,或?qū)е滤梨i的發(fā)生,產(chǎn)生ORA-60的錯(cuò)誤。這些現(xiàn)象都會(huì)對(duì)實(shí)際應(yīng)用產(chǎn)生極大的危害,如長(zhǎng)時(shí)間未響應(yīng),大量事務(wù)失敗等。
轉(zhuǎn)載于:https://www.cnblogs.com/writeLessDoMore/p/6851606.html
總結(jié)
以上是生活随笔為你收集整理的oracle什么时候需要commit的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 永远记住这道题
- 下一篇: android构建过程