首頁 > 軟體

MySQL基礎教學之事務異常情況

2022-10-30 14:00:34

測試異常情況

-- 1. 查詢張三餘額
select * from account where name = '張三';
-- 2. 張三的餘額減少1000
update account set money = money - 1000 where name = '張三';
出錯了....
-- 3. 李四的餘額增加1000
update account set money = money + 1000 where name = '李四';
  • 我們把資料都恢復到2000, 然後再次一次性執行上述的SQL語句(出錯了.... 這句話不符合SQL語 法,執行就會報錯),檢查最終的資料情況, 發現資料在操作前後不一致了。

控制事務一

檢視/設定事務提交方式

SELECT @@autocommit ;
SET @@autocommit = 0 ;

提交事務

COMMIT;

回滾事務

ROLLBACK;

注意:

上述的這種方式,我們是修改了事務的自動提交行為, 把預設的自動提交修改為了手動提 交, 此時我們執行的DML語句都不會提交, 需要手動的執行commit進行提交。

控制事務二

開啟事務

START TRANSACTION 或 BEGIN ;

提交事務

COMMIT;

回滾事務

ROLLBACK;

轉賬案例:

-- 開啟事務
start transaction
-- 1. 查詢張三餘額
select * from account where name = '張三';
-- 2. 張三的餘額減少1000
update account set money = money - 1000 where name = '張三';
-- 3. 李四的餘額增加1000
update account set money = money + 1000 where name = '李四';
-- 如果正常執行完畢, 則提交事務
commit;
-- 如果執行過程中報錯, 則回滾事務
-- rollback;

事務四大特性

  • 原子性(Atomicity):事務是不可分割的最小操作單元,要麼全部成功,要麼全部失敗。
  • 一致性(Consistency):事務完成時,必須使所有的資料都保持一致狀態。
  • 隔離性(Isolation):資料庫系統提供的隔離機制,保證事務在不受外部並行操作影響的獨立環境下執行。
  • 永續性(Durability):事務一旦提交或回滾,它對資料庫中的資料的改變就是永久的。上述就是事務的四大特性,簡稱ACID。

補充:Mysql 事務並行處理的三種異常

髒讀(Dirty Read)【一個事務可能讀取到另一個事務更新但未提交的資料,這個資料有可能是髒資料】

不可重複讀(Nnrepeatable Read)【事務不可重複讀同一條記錄,因為很可能讀到的結果不一致】

幻讀(Phantom Read)【幻讀就是沒有讀到的記錄,以為不存在,但其實是可以更新成功的,並且,更新成功後,再次讀取,就出現了。】

A1存取資料庫,正在進行事務,往表B里加入一條記錄,但是還未提交該事務,此時A2也去存取資料庫了,這個時候,A2可以看到A1加入的資料,這種現象就是髒讀。

A2存取資料庫檢視id=1的資料,這個時候A1存取資料庫,開始了一個事務,更新了id=1的資料,且沒有提交。然後A2又去存取資料庫檢視id=1的資料,看到的資料跟第一次看到的資料不一樣,而是A1更新的資料,這種現象就是不可重複讀。

A2存取資料庫,檢視B表裡的全部資料。這個時候A1又往B表裡加一條記錄,開始了事務但是還未提交。這個時候A2又去檢視了一下,就出現了A1加進去的但還未提交的資料,這種現象就是幻讀。

總結

到此這篇關於MySQL基礎教學之事務異常情況的文章就介紹到這了,更多相關MySQL事務異常情況內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com