資料庫MySQL-事務
- 2020 年 3 月 27 日
- 筆記
1.5 事務
1.5.1 概述
事務(TRANSACTION)是一個整體,要麼一起執行,要麼一起不執行
1.5.2 事務特性
事務必須具備以下四個屬性,簡稱ACID 屬性:
原子性(Atomicity):事務是一個完整的操作。事務的各步操作是不可分的(原子的);要麼都執行,要麼都不執行
一致性(Consistency):當事務完成時,數據必須處於一致狀態
隔離性(Isolation):對數據進行修改的所有並發事務是彼此隔離的。
永久性(Durability):事務完成後,它對資料庫的修改被永久保持。
1.5.3 事務處理
開啟事務
start transaction 或 begin [work]
提交事務
commit
回滾事務
rollback
例題:
-- 插入測試數據 mysql> create table bank( -> card char(4) primary key comment '卡號', -> money decimal(10,2) not null -> )engine=innodb charset=utf8; Query OK, 0 rows affected (0.05 sec) mysql> insert into bank values ('1001',1000),('1002',1); Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0 -- 開啟事務 mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> delimiter // -- 更改定界符 mysql> update bank set money=money-100 where card='1001'; -> update bank set money=money+100 where card='1002' // Query OK, 1 row affected (0.04 sec) Rows matched: 1 Changed: 1 Warnings: 0 -- 回滾事務 mysql> rollback // Query OK, 0 rows affected (0.00 sec) mysql> select * from bank // +------+---------+ | card | money | +------+---------+ | 1001 | 1000.00 | | 1002 | 1.00 | +------+---------+ 2 rows in set (0.00 sec) ------------------------------------------------------------------ -- 開啟事務 mysql> start transaction // Query OK, 0 rows affected (0.00 sec) mysql> update bank set money=money-100 where card='1001'; -> update bank set money=money+100 where card='1002' // Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 -- 提交事務 mysql> commit // Query OK, 0 rows affected (0.00 sec) mysql> select * from bank // +------+--------+ | card | money | +------+--------+ | 1001 | 900.00 | | 1002 | 101.00 | +------+--------+
設置事務的回滾點
-- 開啟事務 mysql> begin // Query OK, 0 rows affected (0.00 sec) mysql> insert into bank values ('1003',500) // Query OK, 1 row affected (0.00 sec) -- 記錄事務的回滾點 mysql> savepoint a1 // Query OK, 0 rows affected (0.00 sec) mysql> insert into bank values ('1004',200) // Query OK, 1 row affected (0.00 sec) -- 回滾到回滾點 mysql> rollback to a1 // Query OK, 0 rows affected (0.00 sec) -- 查詢 mysql> select * from bank // +------+--------+ | card | money | +------+--------+ | 1001 | 900.00 | | 1002 | 101.00 | | 1003 | 500.00 | +------+--------+ 3 rows in set (0.00 sec)
自動提交事務
每一個SQL語句都是一個獨立的事務
小結:
1、事務是事務開啟的時候開始
2、提交事務、回滾事務後事務都結束
3、只有innodb支援事務
4、一個SQL語句就是一個獨立的事務,開啟事務是將多個SQL語句放到一個事務中執行