MySQL高級(六):事務的四大特性和使用

事務

學習目標

  • 能夠知道事務的四大特性

1. 事務的介紹

事務就是用戶定義的一系列執行SQL語句的操作, 這些操作要麼完全地執行,要麼完全地都不執行, 它是一個不可分割的工作執行單元。

事務的使用場景:

在日常生活中,有時我們需要進行銀行轉賬,這個銀行轉賬操作背後就是需要執行多個SQL語句,假如這些SQL執行到一半突然停電了,那麼就會導致這個功能只完成了一半,這種情況是不允許出現,要想解決這個問題就需要通過事務來完成。

2. 事務的四大特性

  • 原子性(Atomicity)
  • 一致性(Consistency)
  • 隔離性(Isolation)
  • 持久性(Durability)

原子性:

一個事務必須被視爲一個不可分割的最小工作單元,整個事務中的所有操作要麼全部提交成功,要麼全部失敗回滾,對於一個事務來說,不可能只執行其中的一部分操作,這就是事務的原子性

一致性:

數據庫總是從一個一致性的狀態轉換到另一個一致性的狀態。(在前面的例子中,一致性確保了,即使在轉賬過程中系統崩潰,支票賬戶中也不會損失200美元,因爲事務最終沒有提交,所以事務中所做的修改也不會保存到數據庫中。)

隔離性:

通常來說,一個事務所做的修改操作在提交事務之前,對於其他事務來說是不可見的。(在前面的例子中,當執行完第三條語句、第四條語句還未開始時,此時有另外的一個賬戶彙總程序開始運行,則其看到支票帳戶的餘額並沒有被減去200美元。)

持久性:

一旦事務提交,則其所做的修改會永久保存到數據庫。

說明:

事務能夠保證數據的完整性和一致性,讓用戶的操作更加安全。

3. 事務的使用

在使用事務之前,先要確保表的存儲引擎是 InnoDB 類型, 只有這個類型纔可以使用事務,MySQL數據庫中表的存儲引擎默認是 InnoDB 類型。

表的存儲引擎說明:

表的存儲引擎就是提供存儲數據一種機制,不同表的存儲引擎提供不同的存儲機制。

汽車引擎效果圖:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-M92wW3OY-1584020324744)(imgs/%E8%A1%A8%E7%9A%84%E5%AD%98%E5%82%A8%E5%BC%95%E6%93%8E.png)]

說明:

  • 不同的汽車引擎,提供的汽車動力也是不同的。

查看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. 小結

  1. 事務的特性:
    • 原子性: 強調事務中的多個操作時一個整體
    • 一致性: 強調數據庫中不會保存不一致狀態
    • 隔離性: 強調數據庫中事務之間相互不可見
    • 持久性: 強調數據庫能永久保存數據,一旦提交就不可撤銷
  2. MySQL數據庫默認採用自動提交(autocommit)模式, 也就是說修改數據(insert、update、delete)的操作會自動的觸發事務,完成事務的提交或者回滾
  3. 開啓事務使用 begin 或者 start transaction;
  4. 回滾事務使用 rollback;
  5. pymysql 裏面的 conn.commit() 操作就是提交事務
  6. pymysql 裏面的 conn.rollback() 操作就是回滾事務
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章