首頁 > 軟體

MySql事務原理介紹及特性

2022-09-16 22:04:30

1. 什麼是事務

一個事務就是一個完整的業務邏輯。

什麼是一個完整的業務邏輯?

假設轉賬,從A賬戶向B賬戶中轉賬10000.

將A賬戶的錢減去10000 ( update語句)

將B賬戶的錢加上10000 ( update語句)

這就是一個完整的業務邏輯。

以_上的操作是-一個最小的工作單元,要麼同時成功,要麼同時失敗,不可再分。

這兩個update語句要求必須同時成功或者同時失敗,這樣才能保證錢是正確的。

僅有 DML (insert、delete、update)才會有事務一說,其他語句與事務無關!!!

本質上說,一個事務其實就是多條 DML 語句同時成功,或者同時失敗!!!

2. 事務是如何做到同時成功失敗

InnoDB 儲存引擎:提供了一組用來記錄事務性活動的紀錄檔檔案

在事務的執行的過程中,每一條 DML 的操作都會記錄到 “事務性活動的紀錄檔檔案” 中。

在事務的執行過程中,我們可以提交事務,也可以回滾事務。

提交事務?

清空事務性活動的紀錄檔檔案,將資料全部徹底持久化到資料庫表中。

提交事務標誌著,事務的結束。並且是一種全部成功的結束。

回滾事務?

將之前所有的 DML 操作全部復原,並且清空事務性活動的紀錄檔檔案。

回滾事務標誌著,事務的結束,並且是一種全部失敗的結束。

3. 如何提交回滾事務

提交事務:commit;

回滾事務:rollback;

事務對應的英語單詞是:transaction

1. mysql 中預設的事務行為是怎樣的

mysql 預設情況下是支援自動提交事務的。(自動提交)

什麼是自動提交?

每執行一次 DML 語句,則提交一次。

如何將 mysql 的自動提交機制關閉呢?

mysql> start transaction;

2. 回滾事務

回滾只能回滾到上一次的提交點

mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from dept_bak;
Empty set (0.00 sec)
mysql> insert into dept_bak values(10, 'abc', 'beijing');
Query OK, 1 row affected (0.00 sec)
mysql> insert into dept_bak values(10, 'abc', 'beijing');
Query OK, 1 row affected (0.00 sec)
mysql> select * from dept_bak;
+--------+------+---------+
| deptno | name | loc     |
+--------+------+---------+
|     10 | abc  | beijing |
|     10 | abc  | beijing |
+--------+------+---------+
2 rows in set (0.00 sec)
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from dept_bak;
Empty set (0.00 sec)

3. 提交事務

mysql> select * from dept_bak;
Empty set (0.00 sec)
mysql> insert into dept_bak values(10, 'aaa', 'bbb');
Query OK, 1 row affected (0.01 sec)
mysql> insert into dept_bak values(10, 'aaa', 'bbb');
Query OK, 1 row affected (0.00 sec)
mysql> select * from dept_bak;
+--------+------+------+
| deptno | name | loc  |
+--------+------+------+
|     10 | aaa  | bbb  |
|     10 | aaa  | bbb  |
+--------+------+------+
2 rows in set (0.00 sec)
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from dept_bak;
+--------+------+------+
| deptno | name | loc  |
+--------+------+------+
|     10 | aaa  | bbb  |
|     10 | aaa  | bbb  |
+--------+------+------+
2 rows in set (0.00 sec)

4. 事務的4個特性

A:原子性

說明事務是最小的工作單元。不可再分。

C:一致性

所有事務要求,在同一個事務當中,所有操作必須同時成功,或同時失敗,以保證資料的一致性。

I:隔離性

A事務和B事務之間具有一定的隔離性。

D:永續性

事務最終結束的一個保障。事務提交,就相當於將沒有儲存到硬碟上的資料儲存到硬碟上。

5. 事務的隔離性

事務隔離性的4個級別:

1. 讀未提交:read uncommitted(最低隔離級別)

事務 A 可以讀取到事務 B 未提交的資料

存在的問題:髒讀現象(Dirty Read)

2. 讀已提交:read committed

事務 A 只能讀取到事務 B 提交之後的資料

這種隔離級別解決了髒讀現象!!!

存在的問題:不可重複讀取資料。

不可讀取資料:

在事務開啟之後,第一次讀到的資料是3條,當前事務還沒有結束,可能第二次再讀取的時候,讀到的資料是4條,3不等於4,稱為不可重複讀取。

3. 可重複讀:repeatble read

事務 A 開啟之後,不管是多久,每一次在事務A中讀取的資料都是一致的。即使事務B將資料已經修改,並且提交了,事務A讀取到的資料還是沒有發生改變,這就是可重複讀。

該隔離級別解決了不可重複讀。

存在的問題:幻影讀。

可重複讀,事務提交之後,只有事務不結束,讀到的資料永遠都是事務剛開始時的資料。

mysql 中預設的事務隔離級別!!!!

4. 序列化/序列化:serializable(最高隔離級別)

這是最高隔離級別,效率最低。解決了所有問題。

這種隔離級別表示事務排隊,不能並行!

每一次讀取到資料都是最真實的,並且效率是最低的。

到此這篇關於MySql事務原理介紹及特性的文章就介紹到這了,更多相關MySql事務內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com