MySQL基礎:事務 事務簡介 事務是一組操作的集合,它是一個不可分割的工作單位,事務會把所有的操作作為一個整體一起向系統提交或撤銷操作請求,即這些操作要麼同時成功,要麼同時失敗。 預設MySQL的事務是自動提交的,也就是說,當執行一條DML(數據操作語言:對資料庫進行增刪改操作)語句,MySQL會 ...
MySQL基礎:事務
事務簡介
-
事務是一組操作的集合,它是一個不可分割的工作單位,事務會把所有的操作作為一個整體一起向系統提交或撤銷操作請求,即這些操作要麼同時成功,要麼同時失敗。
-
預設MySQL的事務是自動提交的,也就是說,當執行一條DML(數據操作語言:對資料庫進行增刪改操作)語句,MySQL會立即隱式地提交事務。
-
案例:銀行轉賬
--建表、存數據
create table account(
id int auto_increment primary key comment '主鍵ID',
name varchar(10) comment '姓名',
money int comment '餘額'
)comment '賬戶表';
insert into account (id, name, money)
values (null,'張三',2000),(null,'李四',3000);
事務操作
- 查看/設置事務提交方式
-- 結果為1為自動提交事務,為0則不是自動提交
SELECT @@autocommit;
-- 設置事務提交方式為手動提交,方式一
SET @@autocommit=0;
-- 設置事務提交方式為手動提交,方式二
START TRANSACTION;
- 提交事務
COMMIT;
- 回滾事務
ROLLBACK;
- 案例:銀行轉賬
-- 張三給李四轉賬1000
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;
事務四大特性(ACID)
- 原子性(Atomicity): 事務是不可分割的最小操作單元,要麼全部成功,要麼全部失敗。
- 一致性(Consistency): 事務完成時,必須使所有的數據都保持一致狀態。
- 隔離性(Isolation): 資料庫系統提供的隔離機制,保證事務在不受外部併發操作影響的獨立環境下運行。
- 持久性(Durability): 事務一旦提交或回滾,它對資料庫中的數據的改變就是永久的。
併發事務問題
問題 | 描述 |
---|---|
臟讀 | 一個事務讀到另外一個事務還沒有提交的數據。 |
不可重覆讀 | 一個事務先後讀取同一條記錄,但兩次讀取的數據不同,稱之為不可重覆讀。 |
幻讀 | 一個事務按照條件查詢數據時,沒有對應的數據行,但是在插入數據時,又發現這行數據已經存在,好像出現了“幻影”。 |
事務隔離級別
隔離級別 | 臟讀 | 不可重覆讀 | 幻讀 |
---|---|---|---|
Read uncommitted | √ | √ | √ |
Read committed | × | √ | √ |
Repeatable Read(MySQL預設) | × | × | √ |
Serializable | × | × | × |
-- 查看事務隔離級別
SELECT @@TRANSACTION_ISOLATION;
--設置事務隔離級別
SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE};
註意:事務隔離級別越高,數據越安全,但是性能越低。
級別:Serializable > Repeatable Read(MySQL預設) > Read committed > Read uncommitted