重新整理 mysql 基礎篇————— mysql 事務[三]

不問前世發表於2021-06-12

前言

簡單整理一下事務。

正文

事務有四大特性:

1.原子性(atomicity)

一個事務必須被視為一個不可分割的最小單元。

2.一致性(consistency)

資料庫總是從一個一致性的狀態轉換到另一個一致性的狀態。

很多人對事務的一致性和原子性可能會有偏差。要理解這個東西呢,首先要拋開mysql,或者我們常見的資料庫sql server,mongodb。

單純來理解資料庫的事務。

假如有兩個事務,事務a和事務b。

假設A和B的兩個賬號,a賬戶是500塊,b賬戶是300塊。

裡面有一個限制就是A賬號不能大於600塊。

事務a 的邏輯是給A增加100塊。然後給B減少100塊。

事務b 的邏輯是給B減少100塊。然後給A增加100塊。

現在事務a,開始執行,做好備份做回滾(500,300),然後給A增加了100塊,A現在是600。

現在事務b,開始執行,做好備份做回滾(600,300),然後給B減少了100塊,現在B是200。

現在事務a開始執行,給B減少100,B變成了100。也急速說b事務提交的是(600,100)

現在b開始執行,但是報錯了,遇到了A不能高於600的限制,現在開始回滾,那麼回滾為(600,300)。

那麼這個時候就變成了(600,300)了。那麼請問事務a和事務b 是否符合原子性?

首先分析事務a,現在能做的,全部執行了。那麼是符合原子性的。

然後分析事務b,的確是回滾了,也是符合原子性的。

這有疑問嗎?沒有吧。

那麼事務a和事務b是否符合一致性呢?

a是否符合一致性呢? 資料庫總是從一個一致性的狀態轉換到另一個一致性的狀態。

一致性的要求是B賬戶減少100塊,A賬戶多出100塊了。這是一致性的要求。

資料庫一開始是:(500,300),然後a提交的時候(600,100),這顯然不符合。

b事務其實是符合一致性的,一開始是(500,300),回滾也是(500,300),這沒錯。

那麼是否一致性就一定要原子性呢?

a=a+1;
try{
  b=b-1
}catch{
  a=a-1;
}

這樣其實也是可以一致性的。

那麼資料庫為什麼不這麼幹呢?比如說 update test set a=a-1;

這個時候回滾的時候還得給你生成一個update test set a=a+1。這是簡單的,如果是複雜的,這是要資料庫稱為人工智慧嗎?資料庫都會傻掉的。

要實現一致性,原子性的成本應該是最低的,但是單單原子性是不能實現一致性的。

3.隔離性

上面我們知道單單原子性是沒有實現一致性。那麼隔離性就是在原子性的基礎上增加一些,一些限制條件那麼就可以實現一致性。

比如說,每個事務只能序列執行,這個時候也說符合的,這也是一種隔離級別。但是如果是序列,就不滿足併發了,所以就有其他隔離級別了,或者說其他隔離方式。

  1. 永續性

一旦事務提交,則其所做的修改就會永久儲存到資料庫中。可能有人說這不是廢話嗎?事務做的修改不就是要保持帶資料檔案中,能夠持久化嗎?

這裡面的永續性,表示的更多的是一種方案。持久化是有很多方式的,怎麼確保你的持久化方案可行呢?比如說一個事務要修改4條語句分別在四張表,那麼怎麼確保這四條語句能夠全部寫入進去呢?會不會寫到第二條的時候系統崩潰呢?

如果出現上面的問題,該怎麼處理?這就是永續性的重要性了。前三個都是強調語句執行,最後一個強調儲存。

以上只是個人整理,如有錯誤,望請指點。

下一節,事務的隔離。

相關文章