1. 程式人生 > >Oracle SQL 事務及觸發器

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;

事務的處理原則

  1. Atomicity 原子性:整個事務所有操作是一個邏輯整體,如同原子一樣不可分割,要麼都成功,要麼都失敗;
  2. Consistency 一致性:事務結束後,無論是提交還是回滾,資料庫中的資料的狀態必須保持一致
  3. Isolation 隔離性:多個事務可能同時執行,這些事務之間彼此保持相互獨立,不能互相影響.
  4. Durablity 永續性:一旦提交了事務處理,那麼事務處理的結果必須要進行持久化.比如寫入磁碟,當資料庫重新啟動時,資料的狀態必須和事務結束時資料的狀態保持一致.

隔離級別有幾種情況需要注意:

  1. 髒讀取:一個事務在執行,可能讀取到外界其他事務對資料的修改,這些修改是尚未提交的修改,可能被rollback.這種現象被叫做髒讀取(搶鎖).
    解決方式:with(updlock)

  2. 不可重讀:同一事務中,前後兩次讀取資料表同一條記錄,所獲得的結果可能是完全不同的.這個現象叫做不可重讀,原因是在第一遍讀取和第二遍讀取之間,有外界的其他事務對資料來源做了修改.這種修改是其他事務結束後對資料的影響,即其他事務修改了資料,並提交了修改.這種修改可以被當前事務識別.
    解決方式:資料共享鎖

    如果發生了不可重讀,是否會發生髒讀?
    答:不會,髒讀取是事務未提交導致的,不可重讀是事務已提交導致的.

  3. 影像讀取(幻影讀取,影分身):在同一事務中,前後兩次執行相同的查詢,第一次查詢所得到的結果集仍然儲存在第二次查詢的結果集中,並且沒有任何改變.當然在第二次查詢中可能有新的記錄加入.

SQL92標準規定的4個隔離級別(針對三種讀取方式是否允許而設立的),三種讀取方式其實是指當前事務對資料庫狀態變化的敏感度:

隔離級別 髒讀取 不可重讀 影像讀取
非提交讀取(Read UnCommited) 允許 允許 允許
已提交讀取(Read Commited) 禁止 允許 允許
可重複讀取(Repeatable Read) 禁止 禁止 允許
序列讀取(Serializable Read) 禁止 禁止 禁止

Oracl只採用了兩種:已提交讀取和序列讀取.

觸發器

其他

樂觀鎖
悲觀鎖

類圖(小組為單位)