重新瞭解數據庫——事務

撒子是事務?

事務的意思是一條或者是一組語句組成一個單元,這個單元要麼全部執行,要麼全不執行

比如我們轉賬,A要給B轉300塊錢,我們需要用兩條sql語句,A賬戶的錢減去500,B賬戶中的錢增加500,但是計算機可能由於某些原因上面語句執行了下面的沒有執行,所以爲了保證兩條語句要麼都執行,要麼都不執行,這時候就用到了事務。

 

事務的四個原則(ACID)

原子性(Atomicity)

事務是一個不可分割的工作單位,事務中的操作要麼都成功,要麼都失敗

一致性(Consistency)

事務前後的數據完整性要保持一致

隔離性(Isolation)

事務的隔離性是多個用戶併發訪問數據庫時,數據庫爲每一個用戶開啓的事務,不能被其他事務的操作數據所幹擾,事物之間要相互隔離。

持久性(Durability)

事務一旦提交則不可逆,被持久化到數據庫中

 

事務實現

--模擬轉賬
set autocommit = 0;  --關閉自動提交
start transaction;    --開啓一組事務

update account set money=money-500 where name='A';  --A的錢-500
update account set money=money+500 where name='B';  --B的錢+500

commit;   --提交事務,就會被持久化
rollback;   --回滾,提交失敗就回滾

set autocommit = 1;   --回覆默認值

 

隔離所導致的一些問題

髒讀:

一個事務讀取了另外一個事務未提交的數據

不可重複讀:

原本有單修改了的數據

幻讀:

別的事務插入的新數據,導致前後讀取不一致

 

隔離級別

1.未提交讀(read-uncommitted)

在一個事務中,可以讀取到其他事務未提交的數據變化,這種讀取其他會話還沒提交的事務,叫做髒讀現象,在生產環境中切勿使用。

2.已提交讀(read-committed)

在一個事務中,可以讀取到其他事務已經提交的數據變化,這種讀取也就叫做不可重複讀,因爲兩次同樣的查詢可能會得到不一樣的結果。

3.可重複讀(repetable-read)

MySQL默認隔離級別,在一個事務中,直到事務結束前,都可以反覆讀取到事務剛開始時看到的數據,並一直不會發生變化,避免了髒讀、不可重複讀現象,但是它還是無法解決幻讀問題。

4.可串行化(serializable)

這是最高的隔離級別,它強制事務串行執行,避免了前面說的幻讀現象,簡單來說,它會在讀取的每一行數據上都加鎖,所以可能會導致大量的超時和鎖爭用問題。

隔離級別 讀數據一致性 髒讀 不可重複讀 幻讀
未提交讀 最低級別,只保證不讀取物理上損壞的數據
已提交讀 語句級
可重複讀 事務級
可串行化 最高級別,事務級

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章