目錄
引言:
什么是事務?
事務和鎖
mysql數據庫控制臺事務的幾個重要操作指令(transaction.sql)
1、事物操作示意圖:
2.事務的隔離級別?
四種隔離級別:
總結一下隔離指令
1. 查看當前隔離級別??
2.設置隔離級別??
??(1) 設置當前會話(臨時生效)
??(2) 設置全局(需管理員權限)??
3.修改默認級別
3.ACID 特性
1.原子性 (Atomicity)??
??2. 一致性 (Consistency)??
??3. 隔離性 (Isolation)??
??4. 持久性 (Durability)??
??類別?? | ??SQL 語句示例?? | ??作用?? |
---|---|---|
??DML?? | INSERT ,?UPDATE ,?DELETE | ??操作數據??(增刪改查) |
??DDL?? | CREATE ,?ALTER ,?DROP | ??定義數據庫結構??(如表、索引、視圖等) |
??DCL?? | GRANT ,?REVOKE | ??控制訪問權限?? |
??TCL?? | COMMIT ,?ROLLBACK | ??管理事務? |
引言:
-
什么是事務?
事務就是用于保證數據的一致性,她由一組相關的dml語句組成,該組的dml語句要么全部成功,要么全部失敗。如:轉賬就必須保證事務的一致性。
比如我這里有兩個指令:
-- 轉賬人
update balance set balance=balance-100 where id = 1--收款人
update balance set balance=balance+100 where id = 2
?如何保證兩條語句同時執行成功?
-
事務和鎖
當執行操作(dml語句) ,mysql會在表上加鎖,防止其他用戶修改表的數據,這對用戶來說是非常重要的
-
mysql數據庫控制臺事務的幾個重要操作指令(transaction.sql)
1.start transaction --開啟一個事務
2.savepoint 自定義保存點的名稱 --設置保存點
3.rollback ro 自定義保存點名稱 --回退事務
4.rollback --回退全部事務,回到事務開始的時候
5.commit --提交事務,結束事務,刪除該事務的所有保存點,刪除鎖,不能回退,數據生效,其他會話[其他連接]可以查看生效的新數據
1、事物操作示意圖:
類似于git的回滾操作
用戶a在進行事務操作的時候,用戶b在數據庫是查看不到一部分數據的變化的,必須要等到用戶a提交才行,這叫事務隔離,至于是看得見哪一部分的數據得取決于用的隔離級別
還有一種開啟事務的方式:set?autocommit = off
-- 關閉當前會話的自動提交(影響后續所有操作)
SET autocommit = 0;
INSERT INTO orders (product_id) VALUES (101);
-- 必須顯式提交
COMMIT;
-- 恢復自動提交(否則后續操作仍需要手動提交)
SET autocommit = 1;
2.事務的隔離級別?
1.多個連接開啟各自事務操作數據庫中的數據時,數據庫系統要負責隔離操作,以保證連接在獲取數據的準確性
2.如果不考慮隔離性,會導致:臟讀、不可重復讀、幻讀
臟讀:當應一個事務讀取另外一個事務尚未提交的修改時,產生臟讀。就是也可能別人回滾了或者放棄提交了,但是你讀到了。
不可重復讀:同一個查詢在同一個事務中多次進行,由于其他用戶提交的事務所做的修改或者刪除,每次返回不同的結果集,此時發生不可重復讀
幻讀:同一個查詢在同一個事務中多次進行,由于其他用戶提交事務所作的插入操作,每次返回不同的結果集
四種隔離級別:
1.讀未提交 read uncommitted
2.讀已提交 read committed
3.可重復讀 repeatable read
4.可串行化 serializable
測試一下功能:
打開兩個操作臺a和b
?指令1:查詢當前mysql的隔離級別
select @@tx_isolation;
或者
SELECT @@transaction_isolation;
會得到一個可重復讀的隔離級別
指令2:修改一下這個用戶a的隔離級別為讀未提交
set session transaction isolation level read uncommitted;
設置成功?
我們來對比一下:
此時用戶a執行一個語句,還沒有commot,但是用戶b也能看見,這就是臟讀
其他情況也是類似,可以自行下去動手查看
那這些臟讀、不可重復讀、幻讀我們都理解了,那鎖呢?
當用戶a開啟事務之后插入更新了一些數據
那么用戶b持有可串行化的隔離級別,是什么情況:
答案是按回車之后被卡住,這個用戶b會一直等待連接到這個數據庫
這時候就有兩種情況:
1.超時:
2.用戶a提交了,用戶b才出現結果?
總結一下隔離指令
1. 查看當前隔離級別??
-- 查看當前會話的隔離級別
SELECT @@SESSION.transaction_isolation;-- 查看全局隔離級別
SELECT @@GLOBAL.transaction_isolation;
2.設置隔離級別??
??(1) 設置當前會話(臨時生效)
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; -- 串行化
??(2) 設置全局(需管理員權限)??
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED; -- 修改全局配置
FLUSH PRIVILEGES; -- 刷新權限(可選)
3.修改默認級別
3.ACID 特性
原子性 (Atomicity) → 確保操作完整性
一致性 (Consistency) → 確保數據有效性
隔離性 (Isolation) → 確保并發可控性
持久性 (Durability) → 確保結果永久性
1.原子性 (Atomicity)??
- ??定義??:事務是最小的工作單元,不可再分割。
- ??核心原則??:事務中的操作??要么全部成功,要么全部失敗回滾??。
- ??示例??:銀行轉賬中,扣款和收款必須同時成功或同時失敗。
??2. 一致性 (Consistency)??
- ??定義??:事務執行前后,數據庫必須從一個一致性狀態變換到另一個一致性狀態。
- ??核心原則??:數據完整性約束(如主鍵、外鍵、唯一約束)不會被破壞。
- ??示例??:轉賬前后,雙方賬戶總額應保持不變。
??3. 隔離性 (Isolation)??
- ??定義??:多個并發事務之間相互隔離,一個事務的操作不應影響其他事務。
- ??核心原則??:通過隔離級別(如?
READ COMMITTED
)控制事務間的可見性。 - ??問題規避??:避免臟讀、不可重復讀、幻讀等問題。
??4. 持久性 (Durability)??
- ??定義??:事務一旦提交,對數據的修改就是永久性的。
- ??核心原則??:即使系統崩潰,數據也能通過日志恢復。
- ??實現機制??:依賴事務日志(如 InnoDB 的 redo log)。