2014-01-11 63 views
4

我對面傳來的交易,我不知道MySQL事務和回滾如何工作?

  1. 是什麼使用它的利弊,
  2. 如何回滾工作,是舊值保存在內存中,如果大,會發生什麼?

對於1.我知道你必須使用它來進行銀行轉帳,但它會不會更好地使用它的一切?

+0

http://dev.mysql.com/doc/refman/5.0/en/commit.html – Rottingham

+0

@Rottingham,是在那裏,但沒有解釋這些問題。 ;)谷歌沒有其他的做,如果你找到我這些網站的解釋,我會很樂意刪除這個問題。 – loveNoHate

+0

注意這些來源。 http://stackoverflow.com/questions/2159045/when-should-i-use-transactions-in-my-queries http://stackoverflow.com/questions/17649926/how-does-mysqlicommit-mysqlirollback-work – Rottingham

回答

17

事務的好處是執行復雜的更改,這可能需要對不同表進行多次更新,並確保它們都會成功或者全部回滾。

這個術語是原子,即該變化不能被細分得更小。事實上,無論您是否要求,MySQL的默認存儲引擎InnoDB都會使用事務。但是大多數人使用一種稱爲autocommit的模式,其中每個語句都會隱式地啓動一個事務並在語句結束後立即提交。在自動提交模式下,您沒有機會選擇回滾。聲明成功,否則,如果遇到錯誤,它會自動回滾。

如果您啓動顯式事務,執行一些更新,然後回滾,InnoDB會恢復數據的原始狀態。它通過將原始數據存儲在名爲回滾段的數據庫區域中來保留原始數據。所以如果你回滾,它只是重新複製這些頁面的數據,以取代你改變的。

這可能需要一些時間,所以如果您嘗試查詢已更改但回退的數據,InnoDB會自動繞行以從回滾段中讀取原始數據,直到它重新合併爲止表格。

舉例說,你開始一個事務,並更新10億行。這會將許多原始行的頁面複製到回滾段,然後使用更改後的數據填充表格 - 但未更改的數據是未提交。沒有人應該能夠讀取未提交的數據,因此查詢該表的任何人都將自動從回滾段獲取原始數據。

然後你回滾你的交易。在接下來的幾分鐘內,InnoDB逐漸清理完畢,最終全部恢復同步。但任何人都可以在此期間繼續查詢原始數據。

如果您已經提交了事務,那麼MySQL會將所有已更改的數據標記爲已提交,隨後讀取數據的任何人都不會經歷從回滾段讀取的輕微開銷。

+0

酷,回滾段。是RAM還是磁盤上的空間/在表中? – loveNoHate

+0

回滾段位於磁盤上的表空間內。 –

+1

那麼,如果我更改這些億行並且內容超過回滾段的大小,交易會停止嗎? – loveNoHate