1. 程式人生 > 資料庫 >MySQL--事務

MySQL--事務

事務的基本介紹:

概念:如果一個包含多個步驟的業務操作,被事務管理,那麼這些操作要麼同時成功,要麼同時失敗。

操作
1,開啟事務:start transaction;
2,回滾:rollback;
3,提交:commit;

理解:也就是在多行sql語句中,加上一行start transaction開頭,那麼這多行語句就相當於一個事務。在執行時,資料是暫時性的修改,除非在末尾加上commit。如果某一行語句出現了錯誤,導致資料的不正確,最後一行就加rollback。

例子:
在這裡插入圖片描述
------中間那一行並沒有加上註釋,如果正常執行的話,將執行Tom那一行,Sam那一行不會執行。(轉錢例子)

MySQL資料庫事務預設自動提交

  • 事務提交的兩種方式
    1,自動提交:mysql就是自動提交的。一條DML語句會自動提交事務。
    2,手動提交:oracle資料庫預設是手動提交事務。需要開啟事務在提交。

  • 修改事務的提交方式
    1,檢視事務的預設提交方式:select @@autocommit; -1代表自動提交,0表示手動提交。
    2,修改預設提交方式:set @@autocommit=0


事務的四大特徵:(面試經常問到)
1,原子性:是不可分割的最小單位,要麼同時成功,要麼同時失敗。
2,永續性:當事務提交或回滾之後,資料庫會持久化的儲存資料。
3,隔離性:多個事務之間,相互獨立。
4,一致性:事務操作前後,資料總量不變。

事務的隔離級別(瞭解):
概念:多個事務之間是隔離的,相互獨立的。但是,如果多個事務操作統一資料,則會引發一些問題,設定不同的隔離級別就可以解決這些問題。

存在問題:
1,髒讀:一個事務,讀取到另一個事務沒有提交的資料。
2,不可重複讀:在同一個事務中,兩次讀取到的資料不一樣
3,幻讀(虛讀):一個事務操作(DML)資料表中所有記錄,另一個事務添加了一條資料,則第一個事務查詢不到自己的修改。

隔離級別:
1,read uncommitted:讀未提交
產生問題:髒讀,不可重複讀,幻讀

2,read committed:讀已提交(Oracle )
產生問題:不可重複讀,幻讀

3,repeatable read:可重複讀(mysql預設)

產生問題:幻讀

4,serializable:序列化
可以解決所有問題

注意:隔離級別從小到大安全性越來越高,但效率越來越低

資料庫查詢隔離級別:
select @@tx_isolation;

資料庫設定隔離級別:
set global transaction isolation level 級別字串;