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
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/547984.html
標籤:MySQL
下一篇:資料庫系統原理之資料庫設計
