Oracle中的事務
一組SQL語句操作要成為事務,資料庫管理系統必須保證這組操作的原子性(Atomicity)、一致性(consistency)、隔離性(Isolation)和持久性(Durability),這就是ACDI特性。
原子性:是指事物中包含的所有操作要麼全做,要麼全不做,也就是說事物的所有活動在資料庫中要麼全部反映,要麼全部不反映,一保證資料時一致的。
一致性:是指資料庫在事務操作前和操作處理,其中的資料必須都滿足業務規定的約束。
隔離性:是指資料庫允許多個並發事務同時對其中的資料進行讀寫好修改的能力,隔離性可以防止事務的並發執行時,由於他們的操作命令交叉執行而導致的資料不一致狀態。
持久性:是指當事務結束後,它對資料庫中的影響是永久的,即便系統遇到故障的情況下,資料也不會丟失。
資料庫事務由以下的部分組成:
一個或多個DML 語句
一個 DDL(Data Definition Language – 資料定義語言 (Data Definition Language)) 語句
一個 DCL(Data Control Language – 資料控制語言) 語句
事務的執行過程:
以第一個 DML 語句的執行作為開始
以下面的其中之一作為結束:
COMMIT 或 ROLLBACK 語句
DDL 或 DCL 語句(自動認可)
使用者會話正常結束
系統異常終了
備忘:使用COMMIT 和 ROLLBACK語句,我們可以: 確保資料完整性;資料改變被提交之前預覽;將邏輯上相關的操作分組。
事務控制語句
Set transaction:設定事務的屬性
Set constrains:設定當前事務的約束模式,設定約束是修改資料的時候,立即起作用,還是當前事務結束後應用。
Savepoint :在事務中建立一個儲存點,復原時,可以指定復原到什麼地方,然後重新執行
Release savepoint:刪除一個儲存點
Rollback:復原事務。級取消對資料庫所做的任何修改
Commit:提交事務,把事務中對資料庫的修改進行永久儲存
資料異常
因為Oracle中支援多個事務並發執行,所以會出現下面的資料異常。
錯讀|髒讀:當user1正在讀資料庫中的表A時,user2正在修改表A,user2修改完了,user1又讀一遍表A,user1讀出的是修改過的資料,而user2又撤消修改了,user1的讀取表A,稱為“錯讀”或者“髒讀”
非重複讀|不重複讀:是指一個事務讀取資料庫中的資料後,另一個事務則更新了資料,當第一個事務再次讀取其中的資料時,就會探索資料已經發生了改變,這就是非重複讀取。非重複讀取所導致的結果就是一個事務前後兩次讀取的資料不相同。
假讀|幻讀:如果一個事務基於某個條件讀取資料後,另一個事務則更新了同一個表中的資料,這時第一個事務再次讀取資料時,根據搜尋的條件返回了不同的行,這就是假讀。
事務中遇到的這些異常與事務的隔離性設定有關,事務的隔離性設定越多,異常就出現的越少,但並發效果就越低,事務的隔離性設定越少,異常出現的越多,並發效果越高。
選擇隔離層
針對3中讀取的資料時產生的不一致現象,在ANSI SQL標準92中定義了4個事務的隔離等級.如下圖所示:
| 隔離等級 |
錯讀|髒讀 |
非重複讀|不重複讀 |
假讀|幻讀 |
| Read uncommitted(非提交讀) |
是 |
是 |
是 |
| Read committed(提交讀) |
否 |
是 |
是 |
| Repeatable read(可重複讀) |
否 |
否 |
|
| Serializable(串列讀) |
否 |
否 |
否 |
Oracle預設的隔離等級是read committed
Oracle支援上述地址隔離層中的兩種read committed和Serializable除此之外oracle中還設定了read only和read write隔離層
Serializable:設定事務的隔離層為它時,
Read only :事務中不能有任何修改資料庫中的資料的動作陳述式,如insert、update、delete、create語句,read only 是Serializable的子集,區別是read only唯讀,Serializable和執行DML語句。
Read write:是預設設定,改選項表示在事務中可以有訪問語句。修改語句。但不經常使用
設定事務的屬性
建立 set transaction的語句
如:
Set transaction read noly
或:
Set transaction read write
或:
Set transaction isolation level read commnitted
或:
Set transaction isolation level serializable
注意:這些語句是互斥的。不能同時設定兩個或兩個以上的選項