事務
學習目標
- 能夠知道事務的四大特性
1. 事務的介紹
事務就是用戶定義的一系列執行SQL語句的操作, 這些操作要麼完全地執行,要麼完全地都不執行, 它是一個不可分割的工作執行單元。
事務的使用場景:
在日常生活中,有時我們需要進行銀行轉賬,這個銀行轉賬操作背後就是需要執行多個SQL語句,假如這些SQL執行到一半突然停電了,那麼就會導致這個功能只完成了一半,這種情況是不允許出現,要想解決這個問題就需要通過事務來完成。
2. 事務的四大特性
- 原子性(Atomicity)
- 一致性(Consistency)
- 隔離性(Isolation)
- 持久性(Durability)
原子性:
一個事務必須被視爲一個不可分割的最小工作單元,整個事務中的所有操作要麼全部提交成功,要麼全部失敗回滾,對於一個事務來說,不可能只執行其中的一部分操作,這就是事務的原子性
一致性:
數據庫總是從一個一致性的狀態轉換到另一個一致性的狀態。(在前面的例子中,一致性確保了,即使在轉賬過程中系統崩潰,支票賬戶中也不會損失200美元,因爲事務最終沒有提交,所以事務中所做的修改也不會保存到數據庫中。)
隔離性:
通常來說,一個事務所做的修改操作在提交事務之前,對於其他事務來說是不可見的。(在前面的例子中,當執行完第三條語句、第四條語句還未開始時,此時有另外的一個賬戶彙總程序開始運行,則其看到支票帳戶的餘額並沒有被減去200美元。)
持久性:
一旦事務提交,則其所做的修改會永久保存到數據庫。
說明:
事務能夠保證數據的完整性和一致性,讓用戶的操作更加安全。
3. 事務的使用
在使用事務之前,先要確保表的存儲引擎是 InnoDB 類型, 只有這個類型纔可以使用事務,MySQL數據庫中表的存儲引擎默認是 InnoDB 類型。
表的存儲引擎說明:
表的存儲引擎就是提供存儲數據一種機制,不同表的存儲引擎提供不同的存儲機制。
汽車引擎效果圖:
說明:
- 不同的汽車引擎,提供的汽車動力也是不同的。
查看MySQL數據庫支持的表的存儲引擎:
-- 查看MySQL數據庫支持的表的存儲引擎
show engines;
說明:
- 常用的表的存儲引擎是 InnoDB 和 MyISAM
- InnoDB 是支持事務的
- MyISAM 不支持事務,優勢是訪問速度快,對事務沒有要求或者以select、insert爲主的都可以使用該存儲引擎來創建表
查看goods表的創表語句:
-- 選擇數據庫
use jing_dong;
-- 查看goods表
show create table goods;
mysql root@(none):jing_dong> show create table goods;
+-------+--------------------------------------------------------+
| Table | Create Table |
+-------+--------------------------------------------------------+
| goods | CREATE TABLE `goods` ( |
| | `id` int(10) unsigned NOT NULL AUTO_INCREMENT, |
| | `name` varchar(150) NOT NULL, |
| | `cate_id` int(10) unsigned NOT NULL, |
| | `brand_id` int(10) unsigned NOT NULL, |
| | `price` decimal(10,3) NOT NULL DEFAULT '0.000', |
| | `is_show` bit(1) NOT NULL DEFAULT b'1', |
| | `is_saleoff` bit(1) NOT NULL DEFAULT b'0', |
| | PRIMARY KEY (`id`) |
| | ) ENGINE=InnoDB AUTO_INCREMENT=25 DEFAULT CHARSET=utf8 |
+-------+--------------------------------------------------------+
說明:
- 通過創表語句可以得知,goods表的存儲引擎是InnoDB。
- 修改表的存儲引擎使用: alter table 表名 engine = 引擎類型;
- 比如: alter table students engine = ‘MyISAM’;
開啓事務:
begin;
或者
start transaction;
說明:
-
開啓事務後執行修改命令,變更數據會保存到本地緩存文件中,而不維護到物理表中
-
MySQL數據庫默認採用自動提交(autocommit)模式,如果沒有顯示的開啓一個事務,那麼每條sql語句都會被當作一個事務執行提交的操作
-
當設置autocommit=0就是取消了自動提交事務模式,直到顯示的執行commit和rollback表示該事務結束。
- set autocommit = 0 表示取消自動提交事務模式,需要手動執行commit完成事務的提交
set autocommit = 0; insert into students(name) values('劉三峯'); -- 需要執行手動提交,數據纔會真正添加到表中, 驗證的話需要重新打開一個連接窗口查看錶的數據信息,因爲是臨時關閉自動提交模式 commit -- 重新打開一個終端窗口,連接MySQL數據庫服務端 mysql -uroot -p -- 然後查詢數據,如果上個窗口執行了commit,這個窗口才能看到數據 select * from students;
提交事務:
將本地緩存文件中的數據提交到物理表中,完成數據的更新。
commit;
回滾事務:
放棄本地緩存文件中的緩存數據, 表示回到開始事務前的狀態
rollback;
事務演練的SQL語句:
begin; insert into students(name) values('李白'); -- 查詢數據,此時有新增的數據, 注意: 如果這裏後續沒有執行提交事務操作,那麼數據是沒有真正的更新到物理表中 select * from students; -- 只有這裏提交事務,才把數據真正插入到物理表中 commit; -- 新打開一個終端,重新連接MySQL數據庫,查詢students表,這時沒有顯示新增的數據,說明之前的事務沒有提交,這就是事務的隔離性 -- 一個事務所做的修改操作在提交事務之前,對於其他事務來說是不可見的 select * from students;
4. 小結
- 事務的特性:
- 原子性: 強調事務中的多個操作時一個整體
- 一致性: 強調數據庫中不會保存不一致狀態
- 隔離性: 強調數據庫中事務之間相互不可見
- 持久性: 強調數據庫能永久保存數據,一旦提交就不可撤銷
- MySQL數據庫默認採用自動提交(autocommit)模式, 也就是說修改數據(insert、update、delete)的操作會自動的觸發事務,完成事務的提交或者回滾
- 開啓事務使用 begin 或者 start transaction;
- 回滾事務使用 rollback;
- pymysql 裏面的 conn.commit() 操作就是提交事務
- pymysql 裏面的 conn.rollback() 操作就是回滾事務