1. 程式人生 > >mysql 命令列處理(六)事務

mysql 命令列處理(六)事務

mysql中,事務是一些資料庫操作語句,有3個特點:

1.只有使用了InnoD引擎的資料庫或者表支援事務

2.事務可以用來維護資料庫完整性,保證成批的sql語句要麼全執行,要麼全不執行,不會出現部分執行失敗導致不一致的情況

3.事務用來管理insert,update,delete語句

事務要滿足4個條件,即分散式系統設計中的ACID原理:

1.atomiclly,原子性,一個事務中的所有操作,要麼全完成,要麼全不完成,不會結束在中間環節,事務執行中發生錯誤會回滾到之前的狀態

2.consistency:一致性,事務開始之前和開始之後,資料庫的完整性沒有被破壞,寫入的資料必須完全符合所有的預設規則,包含資料的精確度、串聯型、後續資料庫可以自發完成預設工作

3.isolation:隔離性:允許多個併發事務同時對資料讀寫和修改,防止多個事務交叉執行導致資料的不一致,事務隔離分成不同級別:讀未提交、讀提交、可重複讀、序列化

4.durability:永續性:事務結束之後,對資料的修改是永久的,即使系統故障也不會丟失

命令列和事務:在命令列中,事務預設是自動提交的,要顯式開啟事務需要使用命令begin

事務開啟語句:

1.begin或者start transaction:顯式開啟一個事務

2.commit:提交一個事務,使修改是永久的

3.rollback:回滾事務,撤銷未提交的修改

4.savepoint identifier:建立一個儲存點,一個事務中可以有多個儲存點

5.release savepoint identifier:刪除一個事務的儲存點,若沒有這個儲存點,丟擲異常

6.rollback to identifier:事務回滾到儲存點

7.set transaction:設定事務的隔離級別,InnoDB提供的級別有read uncommitted,read committed,repeatable read,serializable

操作的例子:

使用begin和commit操作事務:

mysql> create table tmp( id int(5)) engine=innodb;
Query OK, 0 rows affected (0.01 sec)

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into tmp value(5);
Query OK, 1 row affected (0.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from tmp;
+------+
| id   |
+------+
|    5 |
+------+
1 row in set (0.00 sec)

使用rollback回滾未提交的修改

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into tmp value(6);
Query OK, 1 row affected (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (0.01 sec)

mysql> select * from tmp;
+------+
| id   |
+------+
|    5 |
+------+
1 row in set (0.00 sec)

注意,若begin之後沒有commit,而是使用其他語句,比如select,那麼會自動commit,修改直接生效