我發現有人經常 「
濫用」 oracle 中的commit和rollback的用法。
首先,大家要清楚
commit/
rollback,都是用在執行 dml 語句之後的。所謂 dml 語句就是 insert / delete / update / select ,而 create table / view 之類的語句,是 ddl。
dml 語句,執行完之後,處理的資料,都會放在回滾段中(除了 select 語句),等待使用者進行提交(commit)或者回滾 (rollback),當使用者執行commit/
rollback後,放在回滾段中的資料就會被刪除。
所有的 dml 語句都是要顯式提交了,所謂「顯式提交」,就是要執行commit/
rollback。
而其他的諸如 ddl 語句的,都是隱式提交的。就是說,不用進行commit/
rollback。在執行那些非 dml 語句後,oracle 已經進行了隱式提交,例如 create table,在執行指令碼後,表已經建好了,並不在需要你再進行顯式提交。
---------------------
說白了,
對oracle來說
,分為dml(增刪改查)和ddl(建表刪除表)兩種。但凡oracle碰到ddl語句,實際上是做的如下動作:
若不插入字典,後面的動作會出現字典不匹配的情況,所以一commit必然會將ddl語句之前的動作統一提交,假如這個情況出現在儲存過程 中,則ddl前面的增刪改全部被提交了,會出現問題。所以ddl語句最好放在其它地方,以我的程式為例,建表刪表是放在日結中。
對sqlserver來說
,建表刪表這些動作,沒有隱式提交的提交,是由事務啟動開始一直到結束統一完成的,增刪改和建表刪表在一起提交,所以無需
擔心。所以那些對顯式提交有疑問的人,希望這篇文章對大家有用。
ps:select 語句執行後,資料都存在 共享池。提供給其他人查詢相同的資料時,直接在共享池中提取,不用再去資料庫中提取,提高了資料查詢的速度。
不過大家要注意:所謂提供給其他人查詢相同的資料,有很多的條件限制,不在本篇中詳說,請在「共享池的使用注意」一文中在詳細說明。
Oracle ddl隱式提交注意點
今天在測試中意外發現oracle ddl隱式提交需要注意的地方。我們都知道,在同乙個會話中,ddl執行之前,會隱式進行commit操作。但之前的理解一直侷限於這個ddl操作成功,之前的事務才隱式提交,color red 但今天所做的測試,看來並非如此。color 場景1 oracle ddl通過語法...
隱式事務 自動提交事務
如果你一次執行單條查詢語句,則沒有必要啟用事務支援,資料庫預設支援sql執行期間的讀一致性 如果你一次執行多條查詢語句,例如統計查詢,報表查詢,在這種場景下,多條查詢sql必須保證整體的讀一致性,否則,在前條sql查詢之後,後條sql查詢之前,資料被其他使用者改變,則該次整體的統計查詢將會出現讀資料...
隱式事務 自動提交事務
如果你一次執行單條查詢語句,則沒有必要啟用事務支援,資料庫預設支援sql執行期間的讀一致性 如果你一次執行多條查詢語句,例如統計查詢,報表查詢,在這種場景下,多條查詢sql必須保證整體的讀一致性,否則,在前條sql查詢之後,後條sql查詢之前,資料被其他使用者改變,則該次整體的統計查詢將會出現讀資料...