
*****
## 事務
### 1\. 為什么要有事務
事務廣泛的運用于訂單系統、銀行系統等多種場景
例如:
> A用戶和B用戶是銀行的儲戶,現在A要給B轉賬500元,那么需要做以下幾件事:
>
> 1. 檢查A的賬戶余額>500元;
> 2. A 賬戶中扣除500元;
> 3. B 賬戶中增加500元;
正常的流程走下來,A賬戶扣了500,B賬戶加了500,皆大歡喜。
<br>那如果A賬戶扣了錢之后,系統出故障了呢?A白白損失了500,而B也沒有收到本該屬于他的500。
<br>以上的案例中,隱藏著一個前提條件:A扣錢和B加錢,要么同時成功,要么同時失敗。事務的需求就在于此
### 事務
所謂事務,它是一個操作序列,這些操作要么都執行,要么都不執行,它是一個不可分割的工作單位
<br>例如,銀行轉帳工作:從一個帳號扣款并使另一個帳號增款,這兩個操作要么都執行,要么都不執行。所以,應該把他們看成一個事務。事務是數據庫維護數據一致性的單位,在每個事務結束時,都能保持數據一致性
<br>假如一個銀行的數據庫有兩張表:支票表(checking)和儲蓄表(savings)。現在要從用戶Jane的支票賬戶轉移200美元到她的儲蓄賬戶,那么至少需要三個步驟:
1.檢查支票賬戶的余額高于或者等于200美元。
2.從支票賬戶余額中減去200美元。
3.在儲蓄帳戶余額中增加200美元。
上述三個步驟的操作必須打包在一個事務中,任何一個步驟失敗,則必須回滾所有的步驟。
### 事務四大特性(簡稱ACID)
* 原子性(Atomicity)
* 一致性(Consistency)
* 隔離性(Isolation)
* 持久性(Durability)
<br>
* 原子性(atomicity)
> 一個事務必須被視為一個不可分割的最小工作單元,整個事務中的所有操作要么全部提交成功,要么全部失敗回滾,對于一個事務來說,不可能只執行其中的一部分操作,這就是事務的原子性
* 一致性(consistency)
> 數據庫總是從一個一致性的狀態轉換到另一個一致性的狀態。(在前面的例子中,一致性確保了,即使在執行第三、四條語句之間時系統崩潰,支票賬戶中也不會損失200美元,因為事務最終沒有提交,所以事務中所做的修改也不會保存到數據庫中。)
* 隔離性(isolation)
> 通常來說,一個事務所做的修改在最終提交以前,對其他事務是不可見的。(在前面的例子中,當執行完第三條語句、第四條語句還未開始時,此時有另外的一個賬戶匯總程序開始運行,則其看到支票帳戶的余額并沒有被減去200美元。)
* 持久性(durability)
> 一旦事務提交,則其所做的修改會永久保存到數據庫。(此時即使系統崩潰,修改的數據也不會丟失。)
### 事務命令
表的引擎類型必須是innodb類型才可以使用事務,這是mysql表的默認引擎
#### 開啟事務,命令如下:
* 開啟事務后執行修改命令,變更會維護到本地緩存中,而不維護到物理表中
~~~
begin;
或者
start transaction;
~~~
#### 提交事務,命令如下
* 將緩存中的數據變更維護到物理表中
~~~
commit;
~~~
#### 回滾事務,命令如下:
* 放棄緩存中變更的數據
~~~
rollback;
~~~
#### 注意
1. 修改數據的命令會自動的觸發事務,包括insert、update、delete
2. 而在SQL語句中有手動開啟事務的原因是:可以進行多次數據的修改,如果成功一起成功,否則一起會滾到之前的數據
## 事務練習-模擬銀行轉賬
- 1-數據庫-基本使用
- 1-1-數據存儲
- 1-2-數據庫
- 1-3-MySQL安裝和配置
- 1-4-SQL
- 1-5-數據完整性
- 1-6-命令行操作數據庫
- 2-MySQL查詢
- 2-1-MySQL查詢
- 2-2-條件
- 2-3-聚合函數
- 2-4-分組
- 2-5-排序
- 2-6-分頁
- 2-7-連接查詢
- 2-8-子查詢
- 2-9-自關聯
- 3-MySQL外鍵
- 4-MySQL與Python交互
- 4-1-數據準備
- 4-2-數據表的拆分
- 4-3-Python操作MySQL
- 5-MySQL高級
- 5-1-視圖
- 5-2-事務
- 5-3-索引
- 5-4-賬戶管理(了解)
- 6-數據庫存儲引擎
- 6-1-MyISAM存儲引擎
- 6-2-Innodb存儲引擎
- 6-3-CSV存儲引擎
- 6-4-Memory存儲引
- 7-MySQL基準測試
- 8-explain分析SQL語句
- 8-1-影響服務器性能的幾個方面
- 8-2-explain分析SQL
- 9-索引優化案例
- 10-索引優化
- 11-排序優化
- 12-慢查詢日志
- 13-Show Profile進行SQL分析
- 14-數據庫鎖
- 15-主從復制
- 16-MySQL分區表
- 17-MySQL操作規范