撒子是事務?
事務的意思是一條或者是一組語句組成一個單元,這個單元要麼全部執行,要麼全不執行。
比如我們轉賬,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)
這是最高的隔離級別,它強制事務串行執行,避免了前面說的幻讀現象,簡單來說,它會在讀取的每一行數據上都加鎖,所以可能會導致大量的超時和鎖爭用問題。
隔離級別 | 讀數據一致性 | 髒讀 | 不可重複讀 | 幻讀 |
未提交讀 | 最低級別,只保證不讀取物理上損壞的數據 | 有 | 有 | 有 |
已提交讀 | 語句級 | 無 | 有 | 有 |
可重複讀 | 事務級 | 無 | 無 | 有 |
可串行化 | 最高級別,事務級 | 無 | 無 | 無 |