1:先看看什麼是事務吧?
對資料庫的每次操作都可以看做是事務。
事務(transaction)是資料庫管理系統的執行單位,可以是乙個資料庫操作(如select操作)或者是一組操作序列。
事務的特性:
原子性(atomicity)、一致性(consistency)、隔離性(isolation)、永續性(durability)
原子性:保證事務中的所有操作全部執行或全部不執行。例如執行轉賬事務,要麼轉賬成功,要麼失敗。成功,則金額從轉出帳戶轉入到目的帳戶,並且兩個帳戶金額將發生相應的變化;失敗,則兩個賬戶的金額都不變。不會出現轉出帳戶扣了錢,而目的帳戶沒有收到錢的情況。
一致性:保證資料庫始終保持資料的一致性——事務操作之前是一致的,事務操作之後也是一致的,不管事務成功與否。如上面的例子,轉賬之前和之後資料庫都保持資料上的一致性。
隔離性:多個事務併發執行的話,結果應該與多個事務序列執行效果是一樣的。顯然最簡單的隔離就是將所有事務都序列執行:先來先執行,乙個事務執行完了才允許 執行下乙個。但這樣資料庫的效率低下,如:兩個不同的事務只是讀取同一批資料,這樣完全可以併發進行。為了控制併發執行的效果就有了不同的隔離級別。
永續性:永續性表示事物操作完成之後,對資料庫的影響是持久的,即使資料庫因故障而受到破壞,資料庫也應該能夠恢復。通常的實現方式是採用日誌。
2:事務產生的資料問題
事務操作不慎時會產生一些問題,這些問題統一來說就是事務同時發生時導致資料的不一致問題。
髒讀:乙個事務對資料進行修改操作,但是沒有提交時。另外乙個事務對該資料庫進行使用,這樣就會導致資料的不一致,不正確,讀取的該資料為臟資料,讀取操作為臟讀。
不可重複讀:指的是連續的讀取資料,資料值不一致。即第乙個事務讀取資料還沒結束時,第二個事務對資料進行了修改操作,致使第乙個事務再次讀取的時候,讀取的資料與第一次讀取到的資料是不一致的,即資料值不是重複的,成為不可重複讀。
幻讀:乙個事務對全表進行修改操作時,另一事務向資料庫表中插入一條資料,這是第乙個事務會發現有一條資料它沒有修改,像發生幻覺一樣。
產生的條件:必須是在同時發生或者是在第乙個事務還沒操作結束時第二個事務開始操作,才會產生以上的幾種情況。
3:事務的隔離級別
為了解決以上的問題,引入了資料庫的事務的隔離級別
來看看什麼是為了解決上述問題引入的事務的隔離級別?
序列化(serializable):所有事務都乙個接乙個地序列執行,這樣可以避免幻讀(phantom reads)。對於基於鎖來實現併發控制的資料庫來說,序列化要求在執行範圍查詢(如選取年齡在10到30之間的使用者)的時候,需要獲取範圍鎖(range lock)。如果不是基於鎖實現併發控制的資料庫,則檢查到有違反序列操作的事務時,需要滾回該事務。
可重複讀(repeatable read):所有被select獲取的資料都不能被修改,這樣就可以避免乙個事務前後讀取資料不一致的情況。但是卻沒有辦法控制幻讀,因為這個時候其他事務不能更改所選的資料,但是可以增加資料,因為前乙個事務沒有範圍鎖。
讀已提交(read commited):被讀取的資料可以被其他事務修改。這樣就可能導致不可重複讀。也就是說,事務的讀取資料的時候獲取讀鎖,但是讀完之後立即釋放(不需要等到事務結束),而寫鎖則是事務提交之後才釋放。釋放讀鎖之後,就可能被其他事物修改資料。該等級也是sql server預設的隔離等級。
讀未提交(read uncommited):這是最低的隔離等級,允許其他事務看到沒有提交的資料。這種等級會導致髒讀(dirty read)。
資料庫事務操作
事務 當執行一組dml操作時,為了確保資料的完整性和一致性,避免資料庫產生錯誤資料,就需要通過事務 transaction 使該組dml操作同時成功或失敗 示例 create table account id char 36 primary key,card id varchar 20 unique...
資料庫事務操作 資料庫事務隔離級別
參考文章 參考文章 對資料庫dml操作後,先寫入redo log,然後將資料讀到db buffer cache,這時候你查詢的是buffer cache裡面的內容,如果關閉當前視窗重新查詢,或者從其它視窗查詢,是沒有資料的.commit之後通過ckpt程序觸發checkpoint,呼叫dbwn將資料...
oracle資料庫事務併發操作
1 丟失資料修改 當兩個或多個事務選擇同一行,然後基於最初選定的值更新該行時,會發生丟失更新問題。每個事務都不知道其它事務的存在。最後的更新將重寫由其它事務所做的更新,這將導致資料丟失。2 讀 髒 資料 髒讀 讀 髒 資料是指事務t1修改某一資料,並將其寫回磁碟,事務t2讀取同一資料後,t1由於某種...