1. 程式人生 > >MySQL事務以及常用演示

MySQL事務以及常用演示

MySQL 事務以及常用演示

一. MySQL 事務主要用於處理操作量大,複雜度高的資料。比如說,在人員管理系統中,你刪除一個人員,你即需要刪除人員的基本資料,也要刪除和該人員相關的資訊,如信箱,文章等等,這樣,這些資料庫操作語句就構成一個事務!

注意:

  1.  在 MySQL 中只有使用了 Innodb 資料庫引擎的資料庫或表才支援事務。
  2. 事務處理可以用來維護資料庫的完整性,保證成批的 SQL 語句要麼全部執行,要麼全部不執行。
  3. 事務用來管理 insert,update,delete 語句

二.一般來說,事務是必須滿足4個條件(ACID)::原子性(Atomicity,或稱不可分割性)、一致性(Consistency)、隔離性(Isolation,又稱獨立性)、永續性(Durability)。

1.  原子性:一個事務(transaction)中的所有操作,要麼全部完成,要麼全部不完成,不會結束在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。

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

3.隔離性:資料庫允許多個併發事務同時對其資料進行讀寫和修改的能力,隔離性可以防止多個事務併發執行時由於交叉執行而導致資料的不一致。事務隔離分為不同級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重複讀(repeatable read)和序列化(Serializable)。

4.永續性:事務處理結束後,對資料的修改就是永久的,即便系統故障也不會丟失。

在 MySQL 命令列的預設設定下,事務都是自動提交的,即執行 SQL 語句後就會馬上執行 COMMIT 操作。因此要顯式地開啟一個事務務須使用命令 BEGIN 或 START TRANSACTION,或者執行命令 SET AUTOCOMMIT=0,用來禁止使用當前會話的自動提交。

三.事務控制語句:

1. BEGIN或START TRANSACTION:顯式地開啟一個事務;

2. COMMIT:也可以使用COMMIT WORK,不過二者是等價的。COMMIT會提交事務,並使已對資料庫進行的所有修改成為永久性的;

3. ROLLBACK:有可以使用ROLLBACK WORK,不過二者是等價的。回滾會結束使用者的事務,並撤銷正在進行的所有未提交的修改;

4.SAVEPOINT identifier:SAVEPOINT允許在事務中建立一個儲存點,一個事務中可以有多個SAVEPOINT;

5.RELEASE SAVEPOINT identifier:刪除一個事務的儲存點,當沒有指定的儲存點時,執行該語句會丟擲一個異常;

6. ROLLBACK TO identifier:把事務回滾到標記點;

7.SET TRANSACTION:用來設定事務的隔離級別。InnoDB儲存引擎提供事務的隔離級別有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE。

四.MYSQL 事務處理主要有兩種方法:

1、用 BEGIN, ROLLBACK, COMMIT來實現

BEGIN 開始一個事務
ROLLBACK 事務回滾
COMMIT 事務確認

2、直接用 SET 來改變 MySQL 的自動提交模式:

SET GLOBAL AUTOCOMMIT=0 禁止自動提交
SET GLOBAL AUTOCOMMIT=1 開啟自動提交

五.MYSQL事務演示
準備
切換至相應的資料庫下,並查看錶資訊
複製程式碼

 1 mysql> use jobs;
 2 mysql> show table status like "teachers"\G
 3 *************************** 1. row ***************************
 4            Name: teachers
 5          Engine:  MyISAM                 <<
 6         Version: 10
 7      Row_format: Dynamic
 8            Rows: 0
 9  Avg_row_length: 0
10     Data_length: 16384
11 Max_data_length: 0
12    Index_length: 0
13       Data_free: 0
14  Auto_increment: 5
15     Create_time: 2018-10-19 18:20:52
16     Update_time: 2018-10-19 18:22:59
17      Check_time: NULL
18       Collation: utf8_general_ci
19        Checksum: NULL
20  Create_options: 
21         Comment: 
22 1 row in set (0.00 sec)

修改表引擎為InnoDB
複製程式碼

1 mysql> alter table teachers engine=innodb;
 2 Query OK, 1 row affected (0.03 sec)
 3 Records: 1  Duplicates: 0  Warnings: 0
 4 
 5 mysql> show table status like "teachers"\G
 6 *************************** 1. row ***************************
 7            Name: teachers
 8          Engine: InnoDB
 9         Version: 10
10      Row_format: Dynamic
11            Rows: 0
12  Avg_row_length: 0
13     Data_length: 16384
14 Max_data_length: 0
15    Index_length: 0
16       Data_free: 0
17  Auto_increment: 5
18     Create_time: 2018-10-20 04:17:01
19     Update_time: 2018-10-20 04:17:01
20      Check_time: NULL
21       Collation: utf8_general_ci
22        Checksum: NULL
23  Create_options: 
24         Comment: 
25 1 row in set (0.00 sec)

複製程式碼

回滾事務演示
複製程式碼

 1 mysql> start transaction;               <<啟動事務
 2 Query OK, 0 rows affected (0.00 sec)
 3 
 4 mysql> select * from teachers;          <<查看錶資訊
 5 +-----+------------+-----+--------+
 6 | TID | Name       | Age | Gender |
 7 +-----+------------+-----+--------+
 8 |   1 | Song Jiang |  45 | M      |
 9 +-----+------------+-----+--------+
10 1 row in set (0.00 sec)
11 
12 mysql> delete from teachers;           <<刪除表中資料
13 Query OK, 1 row affected (0.01 sec)
14 
15 mysql> select * from teachers;         <<查看錶中資料,現在資料為空
16 Empty set (0.00 sec)
17 
18 mysql> rollback;                       <<回滾事務       
19 Query OK, 0 rows affected (0.01 sec)
20 
21 mysql> select * from teachers;         <<再次檢視資料,發現數據已經恢復
22 +-----+------------+-----+--------+
23 | TID | Name       | Age | Gender |
24 +-----+------------+-----+--------+
25 |   1 | Song Jiang |  45 | M      |
26 +-----+------------+-----+--------+
27 1 row in set (0.00 sec)

提交事務演示
複製程式碼

mysql> start transaction;                      <<啟動事務
Query OK, 0 rows affected (0.00 sec)

mysql> select * from teachers;                 <<查詢表中資料
+-----+------------+-----+--------+
| TID | Name       | Age | Gender |
+-----+------------+-----+--------+
|   1 | Song Jiang |  45 | M      |
+-----+------------+-----+--------+
1 row in set (0.00 sec)

mysql> insert into teachers values (2,'ken',25,'M'); <<向表中插入一些資料
Query OK, 1 row affected (0.00 sec)

mysql> select * from teachers;                  <<再次查看錶中資料
+-----+------------+-----+--------+
| TID | Name       | Age | Gender |
+-----+------------+-----+--------+
|   1 | Song Jiang |  45 | M      |
|   2 | ken        |  25 | M      |
+-----+------------+-----+--------+
2 rows in set (0.00 sec)

mysql> commit;                                <<進行提交資料操作
Query OK, 0 rows affected (0.00 sec)

mysql> select * from teachers;                 <<資料已經生效
+-----+------------+-----+--------+
| TID | Name       | Age | Gender |
+-----+------------+-----+--------+
|   1 | Song Jiang |  45 | M      |
|   2 | ken        |  25 | M      |
+-----+------------+-----+--------+
2 rows in set (0.00 sec)

設定和使用儲存點演示

mysql> start transaction;              <<啟動事務
Query OK, 0 rows affected (0.00 sec)

mysql> select * from teachers;         <<查看錶中資料
+-----+------------+-----+--------+
| TID | Name       | Age | Gender |
+-----+------------+-----+--------+
|   1 | Song Jiang |  45 | M      |
|   2 | ken        |  25 | M      |
+-----+------------+-----+--------+
2 rows in set (0.00 sec)

mysql> savepoint ken1;                <<設定儲存點
Query OK, 0 rows affected (0.00 sec)

mysql> delete from teachers;          <<刪除表中全部的資料
Query OK, 2 rows affected (0.00 sec)

mysql> select * from teachers;        <<查看錶中的資訊,現在為空
Empty set (0.00 sec)

mysql> rollback to ken1;             <<回滾到剛才設定的ken1節點
Query OK, 0 rows affected (0.00 sec)

mysql> select * from teachers;       <<再次查看錶中資訊,已經回到ken1時候的狀態
+-----+------------+-----+--------+
| TID | Name       | Age | Gender |
+-----+------------+-----+--------+
|   1 | Song Jiang |  45 | M      |
|   2 | ken        |  25 | M      |
+-----+------------+-----+--------+
2 rows in set (0.00 sec)

mysql> commit;                       <<進行事務的提交,結束事務
Query OK, 0 rows affected (0.00 sec)

mysql> select * from teachers;       <<可以再檢視一下表中資訊,進行確認
+-----+------------+-----+--------+
| TID | Name       | Age | Gender |
+-----+------------+-----+--------+
|   1 | Song Jiang |  45 | M      |
|   2 | ken        |  25 | M      |
+-----+------------+-----+--------+
2 rows in set (0.00 sec)

關閉自動提交

mysql中一個sql語句就是一個事務,mysql系統預設是開啟了事務提交的功能,可以使用如下命令進行檢視。

mysql> show global variables like "autocommit";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set (0.01 sec)`在這裡插入程式碼片`

如果想要關閉自動提交的功能,可以試下如下命令進行操作。
複製程式碼

mysql> set global autocommit=0;
Query OK, 0 rows affected (0.00 sec)

mysql> show global variables like "autocommit";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | OFF   |
+---------------+-------+
1 row in set (0.00 sec)