1. 程式人生 > >資料庫中事務的概念淺析

資料庫中事務的概念淺析

☆事務的概念
  事務指邏輯上的一組操作,組成這組操作的各個單元,要不全部成功,要不全部不成功。例如:A—>B轉帳,對應於如下兩條sql語句:

    update from account set money=money+100 where name='b';
    update from account set money=money-100 where name='a';

☆資料庫開啟事務命令
  start transaction 開啟事務
  Rollback 回滾事務
  Commit 提交事務
  set transction isolation level 設定事務隔離級別
  select @@tx_isolation 查詢當前事務隔離級別


☆事務的特性(ACID)
  原子性(Atomicity)原子性是指事務是一個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。
  一致性(Consistency)事務必須使資料庫從一個一致性狀態變換到另外一個一致性狀態。
  隔離性(Isolation)事務的隔離性是多個使用者併發訪問資料庫時,資料庫為每一個使用者開啟的事務,不能被其他事務的操作資料所幹擾,多個併發事務之間要相互隔離。
  永續性(Durability)永續性是指一個事務一旦被提交,它對資料庫中資料的改變就是永久性的,接下來的其他操作和資料庫故障不應該對其有任何影響。

☆事務的隔離性
  髒讀指一個事務讀取了另一個事務未提交的資料。這是非常危險的,假設 a 向 b 轉賬 100 元,a 在一臺電腦上開啟事務執行如下 2 步操作,向B存入100元,並把自己的錢減少100元:

    update account set money=money+100 while name='b'; 
    update account set money=money-100 while name='a';

當第1步執行完,第2步還未執行,a 未提交時,此時 b 查詢自己的帳戶就會發現自己多了100元錢,以為 a 轉了100元。如果 a 等 b 走後再回滾,b 就會損失100元。
  不可重複讀:在一個事務內讀取表中的某一行資料,多次讀取結果不同。例如銀行想查詢A帳戶餘額,第一次查詢A帳戶為200元,此時A(另一事務)向帳戶記憶體了100元,此時A帳戶為300元了,銀行可能就會很困惑,不知道哪次查詢是準的。和髒讀的區別是,髒讀是讀未提交,不可重複讀是讀已提交。


  虛讀:是指當事務不是獨立執行時發生的一種現象,例如第一個事務對一個表中的資料進行了修改,這種修改涉及到表中的全部資料行。 同時,第二個事務也修改這個表中的資料,這種修改是向表中插入一行新資料。那麼,以後就會發生操作第一個事務的使用者發現表中還有沒有修改的資料行,就好象 發生了幻覺一樣。
☆事務的隔離級別
  多個執行緒開啟各自事務操作資料庫中資料時,資料庫系統要負責隔離操作,以保證各個執行緒在獲取資料時的準確性。
☆資料庫共定義了四種隔離級別
  Read uncommitted(讀未提交):最低級別,以上情況均無法保證。
  Read committed(讀提交):可避免髒讀情況發生。
  Repeatable read(可重複讀):可避免髒讀、不可重複讀情況的發生。
  Serializable(序列化):可避免髒讀、不可重複讀、虛讀情況的發生。