MySQL事務基礎,看這篇就夠了!


關於MySQL的基礎可以看這篇博客:值得收藏的MySQL基礎總結

事務簡介

事務(Transaction)

  • 事務是一個最小的不可再分的工作單元。通常一個事務對應一個完整的業務(例如銀行賬戶轉賬業務)。
  • 事務處理可以用來維護數據庫的完整性,保證成批的 SQL 語句要麼全部執行,要麼全部不執行。

事務操作

開啓事務
start transaction;
提交事務,即將數據寫入到磁盤中
commit
回滾事務,回到最初的狀態
rollback
查看事務是否開啓自動提交
show variables like 'autocommit';
在這裏插入圖片描述
可以看出在MySQL中事務默認是自動提交的,爲了演示事務,首先我們需要關閉自動提交。
關閉事務自動提交
set autocommit=off;
在這裏插入圖片描述
下面通過一個銀行轉賬的例子進行演示事務,a賬戶要給b賬戶轉賬100元
在這裏插入圖片描述
下面這兩條命令必須同時成功或者同時失敗,這就是一個事務

update bank set money=700 where id=1;
update bank set money=600 where id=2;

所以在執行這兩句之前需要先開啓事務
start transaction;
然後執行事務

update bank set money=700 where id=1;
update bank set money=600 where id=2;

最後提交事務
commit;
這樣一波操作成功之後,數據才能被持久化到磁盤,如果僅僅第一條執行成功了,數據只是在內存中保存,而沒有持久化到數據庫,如果第二條也成功了,那麼可以通過commit提交事務保存到磁盤中,如果第二條語句失敗了,可以通過rollback回滾到最初的狀態,要達到這種目的就需要事務。

事務特徵(ACID)

  • 原子性(Atomicity):事務是最小的單位,不可再分
  • 一致性(Consistency):事務要求所有的操作,必須保證同時成功或同時失敗
  • 隔離性(Isolation):事務與事務之間互相隔離
  • 持久性(Durability):事務執行成功會,會持久到磁盤中

事務安全隱患

事務和事務之間具有隔離性,隔離性分爲四個級別
讀未提交(read uncommitted),事務B讀取了事務A未提交的數據,也叫做:讀髒數據
讀已提交(read committed),事務B讀取了事務A提交的數據(解決了髒讀,這是Oracle的默認隔離級別),也就是說,事務A提交了數據,然後事務B可以讀取,提交一次,只能讀取一次,這也叫做:不可重複讀
可重複讀(repeatable read),事務A提交的數據,事務B可以重複讀取(解決了髒讀和不可重複讀,這是MySQL的默認隔離級別),但是,可能出現兩次讀取的結果不同,這就引起了:幻讀
可串行化(serializable),事務A在處理數據的時候,事務B只能排隊(解決了髒讀、不可重複讀和幻讀),即是串行化,不能併發,效率很低
在這裏插入圖片描述
查看事務的隔離界別
select @@transaction_isolation;,可以看出MySQL默認的是可重複讀。
在這裏插入圖片描述
設置隔離級別爲讀未提交
set session transaction isolation level read uncommitted;
設置隔離界別爲讀已提交
set session transaction isolation level read committed;
設置隔離級別爲可重複讀
set session transaction isolation level repeatable read;
設置隔離界別爲可串行化
set session transaction isolation level serializable;

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