1. 程式人生 > >《HighPerformance MySQL》概譯 事務

《HighPerformance MySQL》概譯 事務

事務

事務是一組被看做一個整體的SQL請求。該組SQL被看成是原子的。如果所有的SQL都正常執行則資料確認請求,如果其中的任何一個失效,則所有的SQL都不生效。也就是說要麼全成功,要麼全失效。

本節並不是針對MySQL的,如果你已經事務的ACID特性瞭解,那麼可以直接瞭解MySQL的事務特性。

銀行系統是一個典型的需要事務特性的例子。假設系統有兩張表支票賬戶和儲蓄表。從Jane的支票賬戶轉義200美元到她的儲蓄賬戶需要至少三步:

1、校驗支票賬戶有超過200的可用額。
2、從支票賬戶劃掉200
3、給儲蓄賬戶增加200

所有操作需要封裝到一個事務中,一旦其中一個步驟失敗,整個操作可以回滾。

用START TRANSACTION開啟事務。用COMMIT提交事務,或者用ROLLBACK回滾事務。因此,整個SQL形如:

START TRANSACTION;
SELECT balance FROM checking WHERE customer_id = 10233276;
UPDATE checking SET balance = balance - 200.00 WHERE customer_id = 10233276;
UPDATE savings SET balance = balance + 200.00 WHERE customer_id = 10233276;
COMMIT;

不過事務不是全部,試想一下,如果在執行第四行的時候資料崩潰了會怎樣。很可能使用者丟失了200元。

事務不是保證正確性的全部,系統必須滿足ACID特性。ACID是指:原子性、一致性、隔離性、永續性。

原子性:事務必須作為一個不可分割的整體。整個事務全部生效或者回滾。不存在部分執行的事務。

一致性:
資料庫必須從一個一致性狀態變為另一個。在我們例子中,一致性保證了發生在第三和第四行之間的資料庫損壞不會造成賬戶中200元的丟失。因為,在事務提交前,事務中任何的修改都不會反應在資料庫中。

隔離性:一個事務的結果對另外的事務通常是不可見的,直到該事務完成。這保證了銀行的賬戶彙總程式執行在第三行和第四行之間的時候,仍然可以看到支票賬戶中的200元。當我們討論隔離性的時候,你將會明白我們所說的"通常不可見"的含義。

永續性:
一旦提交了事務,那麼資料將會永久的改變。這意味著資料必須持久化起來,並且不會因為資料庫的崩潰而丟失。永續性是一個有些模糊的概念,分很多等級。某些持久化的策略比其他的更有安全性保證,不過沒有100%的安全。

ACID事務保證了銀行系統不會弄丟你的錢。這在我們應用的邏輯中很難也幾乎不可能保證的。一個滿足ACID規則的資料庫必須做很多複雜的工作以提供ACID特性。

跟提高鎖的精確範圍一樣,更高的安全的的負面影響就是資料庫要做更多的工作。提供ACID特性的資料庫需要更多的CPU、記憶體利用率和磁碟空間。這是MySQL儲存引擎架構提供的特性。你可以決定你的應用是否需要事務。如果你不需要,你可以選擇效能更高的無事務的儲存引擎。你可以選擇鎖表的策略在無事務的情況下提供你想要的保護。這都取決於你。