事務的由來:
在DBMS中,當多使用者同時訪問或修改同一資料庫表時,可能會造成由於一個使用者的行為結果導致另一個使用者使用的資料無效的問題。為瞭解決這個問題,sql中引入了事務、事務控制、並發處理和鎖定操作。
事務:
事務是指一個工作單元,該單元可以包含多個步驟來完成所需要的任務。在sql中,通過事務將一系列不可分割的資料庫操作做為整體來執行,從而保證了資料庫的完整性和有效性。
資料庫事務就是包含了一組資料庫操作命令的一個操作序列,事務中所有命令作為一個整體向系統提交或撤消操作請求,即資料庫命令執行成功或不成功。
事務的特性:
ATOMIC(原子性):要麼全部都成功,要麼全都不成功。
CONSESTENT(一致性):事務中任何資料變化都符合資料定義的規則。當事務完成時,資料必須處於一致的狀態。事務不能讓資料存放區於不穩定的狀態,即通過事務對資料所做的修改不能損壞資料,在關係型資料庫中,所有的規則必須應用到事務的修改上,以便維護資料的完整性。
ISOLATED(隔離性):多個事務同時進行,它們之間互相干擾。當事務執行修改資料時,如果任何其他進程正在同時使用相同的資料,則直到該事務成功提交後,對資料的修改才能有效。
DURABLE(持久性):一旦事務引發了變化,事務提交以後,所做的工作就永久被儲存下來。即使硬體和應用程式發生錯誤,也必須保證對資料所做的修改不受影響。
事務的分類:
顯示事務:又稱擁護自訂事務,是指顯示的定義其開始和結束的事務。當使用begintran和commit語句發生顯示事務。
隱含交易:是指當前事務或復原後自動開始事務。該事務需要commit語句或rollback語句復原或結束當前事務,在復原後又自動開啟一個事務。(oracle中任何一個DML語句都會開啟一個事務,直到使用者執行commit或rollback操作。)
自動事務是指能夠自動執行並且能夠自動復原的事務,該事務中,事務自動認可;當執行過程產生錯誤的時,則事務被復原。(1.當執行下一條ddl語句時,即使使用者沒有執行commit或rollback操作,Oracle系統也會自動認可當前事務,並開始一個新的事務.2.當DML語句開始執行時,Oracle就通過執行Create table開始執行一個事務,而在create table 執行後自動發出cmmit命令)
事務控制:
事務控制是指為了確保資料庫資料的完整性和有效性,而將一系列不可分割的資料庫操作作為整體執行的操作。事務控制只要包括開始事務和終止事務兩個操作。
set transaction:用於設定下一個要執行事務屬性。
start transaction:表示執行開始事務。
ser constrains:用於設定在當前事務中約束模式。
savepoint:是指在事務中設定的儲存點。儲存點可以理解為斷點,用來標識重新開始事務時的位置。
release savepoint:表示釋放儲存點。
rollback:表示終止事務
commit:表示提交事務
並發控制:
當多個使用者對同一資料進行操作時,就需要對該操作進行並發控制。
並行作業的問題:
丟失更新:是指多個事務同時操作一行資料時,並且基於最初選定的值被更改時,每個事務都不知道其他事務的存在。最後更新將重寫由其他事務所做的更新,這將導致資料丟失的現象的發生。
髒讀:是指當第二個事務選擇其他事務正在更新時,會發生未確認的相關性問題,第二個事務正在讀取的資料還沒有確認並且可能被更新此行的事務所更改。
非重複讀:非重複讀和髒讀類似,是指第二個事務多次訪問同一行資料而且每次讀取不同資料時,會發生不一致的問題。
虛讀:是指當對某行執行插入或刪除操作,而該行屬於某個事務正在讀取的範圍時,會發生虛讀的問題
交易隔離等級
交易隔離等級可以理解為鎖定該事務正在以減少其他事務對這些資料庫的影響,保證資料的一致性,在多使用者系統中,經常出現多個事務同時需要操作某一個資料庫中的資料的情況,為了防止事務之間的相互影響,提高資料庫資料的安全性和完整性,資料庫系統提供了隔離機制
隔離等級:
就是一個事務必須和其他事務隔離的程度
1.未提交讀(read uncommitted):未提交讀是最低的事務隔離,僅保證不讀取物理損壞的資料。
2.提交讀(read committed):提交讀隔離等級比未提交讀隔離等級更高一層,提交讀隔離等級是大多數主流資料庫的預設隔離等級,其保證了一個事務不會讀到另一個並行事務已修改但為提交的資料,避免了"髒讀取"的情況發生
3.可重複讀(Repeatable Read):可重複讀隔離等級保證了一個事務不會修改已經由另一個事務讀取但復原的資料,避免了"髒讀取"和"不可重複讀取"的情況發生。
4.可序列化(Serializable):可序列化隔離等級是最高的事務隔離等級,是將事務以中順序的方式串連起來,以防止一個事務影響其他事務