Oracle SQL 事務及觸發器
事務
一個事務的生命週期包含三個部分:
1. 事務開始
2. 事務執行
3. 事務結束
Oracle不會顯式宣告事務開始,而是由Oracle自行處理
commit
rollback
set point
rollback to point
事務的屬性和隔離級別
read only 只讀
read write 讀寫
serializable 隔離級別
隔離級別的事務是序列化事務,序列化事務與只讀事務,具有完全相同的隔離級別.對外界其他事務對資料庫的修改操作是沒有認知的.
read commited
set transaction read only;
事務的處理原則
- Atomicity 原子性:整個事務所有操作是一個邏輯整體,如同原子一樣不可分割,要麼都成功,要麼都失敗;
- Consistency 一致性:事務結束後,無論是提交還是回滾,資料庫中的資料的狀態必須保持一致
- Isolation 隔離性:多個事務可能同時執行,這些事務之間彼此保持相互獨立,不能互相影響.
- Durablity 永續性:一旦提交了事務處理,那麼事務處理的結果必須要進行持久化.比如寫入磁碟,當資料庫重新啟動時,資料的狀態必須和事務結束時資料的狀態保持一致.
隔離級別有幾種情況需要注意:
髒讀取:一個事務在執行,可能讀取到外界其他事務對資料的修改,這些修改是尚未提交的修改,可能被rollback.這種現象被叫做髒讀取(搶鎖).
解決方式:with(updlock)不可重讀:同一事務中,前後兩次讀取資料表同一條記錄,所獲得的結果可能是完全不同的.這個現象叫做不可重讀,原因是在第一遍讀取和第二遍讀取之間,有外界的其他事務對資料來源做了修改.這種修改是其他事務結束後對資料的影響,即其他事務修改了資料,並提交了修改.這種修改可以被當前事務識別.
解決方式:資料共享鎖如果發生了不可重讀,是否會發生髒讀?
答:不會,髒讀取是事務未提交導致的,不可重讀是事務已提交導致的.影像讀取(幻影讀取,影分身):在同一事務中,前後兩次執行相同的查詢,第一次查詢所得到的結果集仍然儲存在第二次查詢的結果集中,並且沒有任何改變.當然在第二次查詢中可能有新的記錄加入.
SQL92標準規定的4個隔離級別(針對三種讀取方式是否允許而設立的),三種讀取方式其實是指當前事務對資料庫狀態變化的敏感度:
隔離級別 | 髒讀取 | 不可重讀 | 影像讀取 |
---|---|---|---|
非提交讀取(Read UnCommited) | 允許 | 允許 | 允許 |
已提交讀取(Read Commited) | 禁止 | 允許 | 允許 |
可重複讀取(Repeatable Read) | 禁止 | 禁止 | 允許 |
序列讀取(Serializable Read) | 禁止 | 禁止 | 禁止 |
Oracl只採用了兩種:已提交讀取和序列讀取.
觸發器
其他
樂觀鎖
悲觀鎖
類圖(小組為單位)