事務

事務

什麼是事務?
事務是包含一個或多個SQL語句的邏輯的、原子的工作單元。事務將SQL語句分組,以便它們可以一起
被提交,即將其應用到數據庫,或者一起被回滾,即將其從數據庫中撤消。ORACLE數據庫將爲每個事務
分配一個稱爲事務ID的唯一標識符。

什麼是事務的ACID屬性?
原子性:事務中的所有任務,要麼全部執行,要麼都不執行。不存在部分完成的事務。例如,事務做刪除
1000w條數據,結果完成了500w時出現故障,則數據庫會回滾這500w行數據。
一致性:事務將會數據庫從一個一致狀態變爲另一一致狀態。例如:從張三的儲蓄銀行轉賬到李四的事務中,
故障一定不能導致數據庫僅僅只更改一個賬戶的數據,這會導致數據不一致。
隔離性:一個事務必須在被提交後,其他事務才能看見效果。例如,正在更新scott.emp表的一個用戶,不會
看到另個會話用戶在emp表上未提交的更改。因此,對這些用戶來說,這些事務好像是串行執行的。
持久性:已提交的事務所做的更改是永久性的。事務完成後,數據庫通過其恢復機制,確保在事務中所做的更改
不會丟失。

事務從哪裏開始?
事務開始於所遇到的第一個可執行SQL語句。可執行的SQL語句是能產生數據庫實例調用的SQL語句,包括DML和DDL
語句,及SET transaction語句。
當事務開始時,Oracle數據庫將爲事務分配一個可用的撤銷數據段,以記錄新事物的撤消條目。數據庫在第一個DML
語句過程中,首先會分配撤銷段和事務表槽,然後分配事務ID
xid=xidusn+xidslot+xidsqn
SQL> select xid,xidusn,xidslot,xidsqn,status from v$transaction;
XID                  XIDUSN    XIDSLOT     XIDSQN STATUS
---------------- ---------- ---------- ---------- ----------------
020003009DF30000          2          3      62365 ACTIVE
那麼事務結束於什麼時候?
用戶沒有savepoint子句的語句中發出commit或rollback
用戶運行一個ddl命令;數據庫在每個DDL語句之前和之後發出一個隱式的commit語句
用戶從大多數oracle數據庫實例程序和工具正常退出,導致當前事務被隱式提交。當用戶斷開連接時的提交行爲依
賴於應用程序,並且是可配置的。
客戶端進程異常終止,導致數據庫使用存儲在事務表和撤銷段中的元數據來隱式回滾事務。

事務控制語句
commit:語句結束當前用戶,並使在事務中執行的所有更改都具有持久性。提交還會清除在事務中的所有保存點,並釋
放事務鎖。
rollback:語句將取消當前事務中所做的工作,他導致所有自上次提交或回滾以來的數據更改被丟棄。rollback to
savepoint 語句將撤消自上次保存點以來所做的更改,但不會結束整個事務。
savepoint:語句標識在事務中你可以稍後回滾到的點。

active事務
是已開始但尚未提交或回滾的事務。
在事務提交或回滾之前,事務對數據所做的更改是暫時的。在事務結束之前,數據狀態如下分析:
1)、oracle數據庫已在SGA中生成了undo段數據信息包含事務中的SQL 語句所更改的數據舊值
2)、已在SGA中online redo log中生成了重做信息。redo log記錄裏包含了data block和undo block
的更改
3)、已經對sga中buffers進行了修改;已提交事務所做的數據更改,存儲在SGA的數據buffers中,但不一定
立即由數據庫dbwr寫入到數據文件。磁盤寫入可能會在提交之前(例如大事務)或之後發生。
4)、數據更改所影響的行已被鎖定。

savepoint幹嘛的?
是事務上下文中的一個由用戶聲明的中間標記。在內部,此標記將被解析爲一個SCN。保存點將長事務劃分爲多個
更小的部分。
如果你在一個長事務中使用保存點,則您就可以在之後將事務中執行的工作回滾到當前時間之前,卻又在事務中聲明
的某個保存點之後。因此,如果您錯誤,您不需要重新提交所有每個語句。

rollback a savepoint
在未提交事務中回滾到某個保存點,意味着該指定的保存點之後所做的任何更改都將被撤消,但它並不意味着事務本
身的回滾。

enquened transactions
取決於當時的場景,之前在等待被鎖定資源的事務,在回滾到保存點後,可能仍處於阻塞狀態。一個事務被另一個事
務阻塞時,它會在阻塞事務後面排隊,因此整個阻塞事務必須提交或回滾,被阻塞的事務才能得以繼續。

對未引用任何保存點的整個事務的回滾,Oracle 數據庫執行下列操作:
1)、通過使用相應的undo段,撤消事務中所有SQL語句所做的所有更改
每個活動事務的事務表條目包含一個指向該事務的所有撤消數據 (與應用順序相反)的指針。數據庫從撤銷段中讀取
數據,反轉其操作,然後將撤消條目標記爲已應用。因此,如果一個事務插入行,則其回滾刪除行。如果一個事務更新行,
則其回滾反轉這個更新。如果一個事務刪除一個行,則其回滾重新插入該行。
2)、釋放由事務持有的所有數據鎖
3)、清除在事務中的所有保存點
4)、結束事務

發佈了59 篇原創文章 · 獲贊 1 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章