mysql事務
- mysql的事務必需要Innodb數據庫引擎的數據庫或表才支持事務
事務是必須知足4個條件(ACID)
- 原子性:一個事務(transaction)中的全部操做,要麼所有完成,要麼所有不完成,不會結束在中間某個環節。事務在執行過程當中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務歷來沒有執行過同樣。
- 一致性:在事務開始以前和事務結束之後,數據庫的完整性沒有被破壞。這表示寫入的資料必須徹底符合全部的預設規則,這包含資料的精確度、串聯性以及後續數據庫能夠自發性地完成預約的工做。
- 隔離性:數據庫容許多個併發事務同時對其數據進行讀寫和修改的能力,隔離性能夠防止多個事務併發執行時因爲交叉執行而致使數據的不一致。事務隔離分爲不一樣級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重複讀(repeatable read)和串行化(Serializable)。
- 持久性:事務處理結束後,對數據的修改就是永久的,即使系統故障也不會丟失。
事務的控制語句
- BEGIN 或 START TRANSACTION 顯式地開啓一個事務;
- COMMIT 也可使用 COMMIT WORK,不過兩者是等價的。COMMIT 會提交事務,並使已對數據庫進行的全部修改爲爲永久性的;
- ROLLBACK 也可使用 ROLLBACK WORK,不過兩者是等價的。回滾會結束用戶的事務,並撤銷正在進行的全部未提交的修改;
- SAVEPOINT identifier,SAVEPOINT 容許在事務中建立一個保存點,一個事務中能夠有多個 SAVEPOINT;
- RELEASE SAVEPOINT identifier 刪除一個事務的保存點,當沒有指定的保存點時,執行該語句會拋出一個異常;
- ROLLBACK TO identifier 把事務回滾到標記點;
- SET TRANSACTION 用來設置事務的隔離級別。InnoDB 存儲引擎提供事務的隔離級別有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE。
- SET AUTOCOMMIT=0 禁止自動提交
- SET AUTOCOMMIT=1 開啓自動提交
mysql> create table user(id int(8)); # 建立測試表
Query OK, 0 rows affected (0.03 sec)
mysql> select * from user;
Empty set (0.00 sec)
mysql> begin; # 開啓事務
Query OK, 0 rows affected (0.00 sec)
mysql> insert into user values(6); # 插入數據
Query OK, 1 row affected (0.00 sec)
mysql> select * from user;
+------+
| id |
+------+
| 6 |
+------+
1 row in set (0.00 sec)
mysql> rollback; # 回滾, 並結束事務
Query OK, 0 rows affected (0.00 sec)
mysql> select * from user; # 事務開啓的後插入的數據已經不存在
Empty set (0.00 sec)
mysql> begin; # 開啓事務
Query OK, 0 rows affected (0.00 sec)
mysql> insert into user values(7);
Query OK, 1 row affected (0.00 sec)
mysql> commit; # 提交併結束事務
Query OK, 0 rows affected (0.00 sec)
mysql> select * from user;
+------+
| id |
+------+
| 7 |
+------+
1 row in set (0.00 sec)
mysql> rollback; # 嘗試回滾
Query OK, 0 rows affected (0.00 sec)
mysql> select * from user; # 回滾失敗,數據已經提交
+------+
| id |
+------+
| 7 |
+------+
1 row in set (0.00 sec)
-----------------------------------
mysql> select * from user;
+------+
| id |
+------+
| 7 |
+------+
1 row in set (0.00 sec)
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into user values(8);
Query OK, 1 row affected (0.00 sec)
mysql> select * from user;
+------+
| id |
+------+
| 7 |
| 8 |
+------+
2 rows in set (0.00 sec)
mysql> savepoint test; # 設置保存點
Query OK, 0 rows affected (0.00 sec)
mysql> insert into user values(9);
Query OK, 1 row affected (0.00 sec)
mysql> select * from user;
+------+
| id |
+------+
| 7 |
| 8 |
| 9 |
+------+
3 rows in set (0.00 sec)
mysql> rollback to test; # 回滾到保存點,但事務並無結束
Query OK, 0 rows affected (0.00 sec)
mysql> select * from user; # 回滾成功
+------+
| id |
+------+
| 7 |
| 8 |
+------+
2 rows in set (0.00 sec)