標籤:
今天溫習oracle事務,記錄如下:
- 事務定義
事務是保持資料的一致性,它由相關的DDL或者DML語句做為載體,這組語句執行的結果要麼一起成功,要麼一起失敗。 我們知道SQL92標準定義了資料庫事務的四個特點:
- 原子性 (Atomicity) :一個事務裡面所有包含的SQL語句是一個執行整體,不可分割,要麼都做,要麼都不做
- 一致性 (Consistency) :事務開始時,資料庫中的資料是一致的,事務結束時,資料庫的資料也應該是一致的
- 隔離性 (Isolation): 多個事務並發的獨立運行,而不能互相干擾,一個事務修改,新增,刪除資料在根據當前事務的交易隔離等級基礎上,其餘事務能看到相應的結果(這裡為什麼這麼說,下面我會給我具體的例子進行分析)
- 持久性 (Durability) : 事務被提交後,資料會被永久儲存
2.
事務控制命令
- COMMIT 提交事務
- SAVEPOINT 事務儲存點 (savepoint a)
- ROLLBACK(TO) 復原[復原到定義的儲存點] rollback to a
3.
鎖的概念
鎖是為了保證多個並發的事務在引用同一個資源時,對資源的保護,同時也防止事物間的相互破壞。 4.
Oracle中鎖類型
- 共用鎖定(表鎖)共用鎖定有一下幾種模式
- 行共用模式 : 不運行其它使用者插入,刪除,更新操作,多個使用者可以同時作用於該表,都能查詢。文法如下:Lock table XX in share mode
- 行共用更新模式 : 允許多個使用者同時鎖定表中不同的行,能執行DML語句,除了那些被鎖定的行。
- 獨佔鎖定(行鎖): 不允許其它使用者對該表插入,刪除,修改操作,只能查詢,同時其它使用者不能修改和鎖定表
- 死結 : 所個事務對資源的相互等待,造成死結。
5.
交易隔離等級 交易隔離等級定義了事務之間的隔離程度。SQL92標準中定義了4中隔離等級。
- 未提交讀 (READ UNCOMMITTED) 幻想讀、不可重複讀取和髒讀都允許。
- 提交讀 (READ COMMITTED) 允許幻想讀、不可重複讀取,不允許髒讀。
- 重複讀 (REPEATABLE READ) 允許幻想讀,不允許不可重複讀取和髒讀。
- 序列化 (SERILIZABLE) 幻想讀、不可重複讀取和髒讀都不允許。
通過一些現象,可以反映出設定交易隔離等級產生的效果:
- 幻想讀(幻讀): 事務T1讀取一條指定where條件的語句,返回結果集。此時事務T2插入一行新記錄,恰好滿足T1的where條件。然後T1使用相同的條件重新查詢,結果集中可以看到T2插入的記錄,這條新紀錄就是幻想。
- 髒讀: 事務T1修改了一條資料,但是還未提交,事務T2恰好讀取到了這條修改後了的資料,此時T1將交易回復,這個時候T2讀取到的資料就是髒資料,稱為髒讀。
- 不可重複讀取:事務T1讀取一行記錄,緊接著事務T2修改了T1剛剛讀取的記錄,然後T1重新查詢,發現與第一次讀取的記錄不同,這稱為不可重複讀取。
6.
Oracle的交易隔離等級 ORACLE提供了SQL92標準中的read committed和serializable,同時提供了非SQL92標準的read-only。
- READ COMMITTED
- 這是ORACLE預設的交易隔離等級。
- 事務中的每一條語句都遵從語句級的讀一致性。
- 保證不會髒讀;但可能出現非重複讀和幻像。
- SERIALIZABLE
- 簡單地說,serializable就是使事務看起來象是一個接著一個地順序地執行。
- 僅僅能看見在本事務開始前由其它事務提交的更改和在本事務中所做的更改(也就是說其它事務在本事務開始後所做的修改,即使提交了,本事務也看不到)
- 保證不會出現非重複讀和幻像。
- Serializable隔離等級提供了read-only事務所提供的讀一致性(事務級的讀一致性),同時又允許DML操作.
- 設定隔離等級
- 設定一個事務的隔離等級
- SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
- SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
- SET TRANSACTION READ ONLY;
- 設定單個會話的隔離等級
- ALTER SESSION SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
- ALTER SESSION SET TRANSACTION ISOLATION SERIALIZABLE;
7.具體例子
-
- 準備SQL
- Sql代碼
- create table A(
- id int,
- name varchar2(50),
- primary key(id)
- );
- 示範一個T1插入,T2讀取資料
- T1提交事務後,T2可以看到資料
- 我們看到了交易隔離等級的效果,那麼T1,T2事務執行時,oracle怎麼設定這兩個事務的鎖的呢?我們來看一下這個操作
- 當T1提交後,T2修改表A成功
- 示範2個事務,T1更新表A的資料,T2刪除表2的資料
- 示範事務的隔離等級
- T1事務設定隔離等級為SERIALIZABLE,T2為預設層級
- 有的朋友可能會問,是不是T2未提交造成的,那麼我們將T2提交後的結果如下
- 我們看看T3的查詢結果
- 由上述結果我們可以知道,如果事務設定了序列化的隔離等級,那麼在該事務期間,其它事務對該事物中引用的資源修改將不可見。
好了,今天的總結到此,還會有後續文章
http://kingj.iteye.com/blog/1675011#bc2358875
oracle事務(轉)