1. 程式人生 > 其它 >MySQL:資料庫事務

MySQL:資料庫事務

1 什麼是事務

事務是一個整體,由一條或者多條SQL 語句組成,這些SQL語句要麼都執行成功,要麼都執行失敗,

只要有一 條SQL出現異常,整個操作就會回滾,整個業務執行失敗

比如: 銀行的轉賬業務,張三給李四轉賬500元 , 至少要操作兩次資料庫, 張三 -500, 李四 + 500,這中
間任何一步出現問題,整個操作就必須全部回滾, 這樣才能保證使用者和銀行都沒有損失.
  • 回滾

即在事務執行的過程中發生了某種故障,事務不能繼續執行,系統將事務中對資料庫的所有已完成的操 作全部撤銷,滾回到事務開始時的狀態。(在提交之前執行)

2 模擬轉賬操作

1) 建立 賬戶表

-- 建立賬戶表
CREATE
TABLE account( -- 主鍵 id INT PRIMARY KEY AUTO_INCREMENT, -- 姓名 NAME VARCHAR(10), -- 餘額 money DOUBLE ); -- 新增兩個使用者 INSERT INTO account (NAME, money) VALUES ('tom', 1000), ('jack', 1000);

2) 模擬tom 給 jack 轉 500 元錢,一個轉賬的業務操作最少要執行下面的 2 條語句:

-- tom賬戶 -500元
UPDATE account SET money = money - 500 WHERE NAME = 'tom';
--
jack賬戶 + 500元 UPDATE account SET money = money + 500 WHERE NAME = 'jack';

注:

假設當tom 賬號上 -500 元,伺服器崩潰了。jack 的賬號並沒有+500 元,資料就出現問題了。
我們要保證整個事務執行的完整性,要麼都成功, 要麼都失敗. 這個時候我們就要學習如何操作事務

3 MySql事務操作

MYSQL 中可以有兩種方式進行事務的操作:

  •   手動提交事務
  •   自動提交事務

手動提交事務

語法格式

功能 語句
開啟事務 start transaction; 或者 BEGIN;
提交事務 commit;
回滾事務 rollback;
  • START TRANSACTION
    •   這個語句顯式地標記一個事務的起始點
  • COMMIT
    • 表示提交事務,即提交事務的所有操作
    • 具體地說,就是將事務中所有對資料庫的更新都寫 到磁碟上的物理資料庫中,事務正常結束。   
  • ROLLBACK
    • 表示撤銷事務,即在事務執行的過程中發生了某種故障,事務不能繼續執行
    • 系統將事務中 對資料庫的所有已完成的操作全部撤銷,回滾到事務開始時的狀態           

手動提交事務流程

  執行成功的情況: 開啟事務 -> 執行多條 SQL 語句 -> 成功提交事務

  執行失敗的情況: 開啟事務 -> 執行多條 SQL 語句 -> 事務的回滾

成功案例 演示

  • 模擬張三給李四轉 500 元錢

1) 命令列登入資料庫

2)使用db2資料庫

USE db2;

3) 執行以下SQL

  • 3.1 開啟事務
start transaction;
  • 3.2 tom賬戶 -500
update account set money = money - 500 where name = 'tom'
  • 3.3 jack賬戶 +500
update account set money = money + 500 where name = 'jack';

4) 此時我們使用 sqlYog查看錶,發現數據並沒有改變

5) 在控制檯執行 commit 提交事務

commit;

6) 再次使用sqlYog檢視, 發現數據在事務提交之後,發生改變

事務回滾演示

  如果事務中,有某條sql語句執行時報錯了,我們沒有手動的commit,那整個事務會自動回滾

1) 命令列 開啟事務

start transaction;

2) 插入兩條資料

INSERT INTO account VALUES(NULL,'張百萬',3000);
INSERT INTO account VALUES(NULL,'有財',3500);

3) 不去提交事務 直接關閉視窗,發生回滾操作,資料沒有改變

注:

如果事務中 SQL 語句沒有問題,commit 提交事務,會對資料庫資料的資料進行改變。

如果事務 中 SQL 語句有問題,rollback 回滾事務,會回退到開啟事務時的狀態。

自動提交事務

MySQL 預設每一條 DML(增刪改)語句都是一個單獨的事務,每條語句都會自動開啟一個事務,語句執 行完畢 自動提交事務,MySQL 預設開始自動提交事務

MySQL預設是自動提交事務

自動提交事務演示

1) 將tom賬戶金額 +500元

2) 使用 SQLYog 檢視資料庫:發現數據已經改變

取消自動提交

MySQL預設是自動提交事務,設定為手動提交.

1) 登入mysql,檢視autocommit狀態。

SHOW VARIABLES LIKE 'autocommit';

on :自動提交

off : 手動提交

2) 把 autocommit 改成 off;

SET @@autocommit=off;

3) 再次修改,需要提交之後才生效

  將jack 賬戶金額 -500元

-- 選擇資料庫
use db2;
-- 修改資料
update account set money = money - 500 where name = 'jack';
-- 手動提交
commit;

事務的四大特性 ACID

特 性 含義
原 子 性 每個事務都是一個整體,不可再拆分,事務中所有的 SQL 語句要麼都執行成功, 要麼都 失敗。
一 致 性

事務在執行前資料庫的狀態與執行後資料庫的狀態保持一致。

如:轉賬前2個人的 總金額 是 2000,轉賬後 2 個人總金額也是 2000

隔 離 性 事務與事務之間不應該相互影響,執行時保持隔離的狀態.
持 久 性 一旦事務執行成功,對資料庫的修改是持久的。就算關機,資料也是要儲存下來的.