1. 程式人生 > >Mysql-檢視,事務

Mysql-檢視,事務

檢視

1. 問題

對於複雜的查詢,往往是有多個數據表進行關聯查詢而得到,如果資料庫因為需求等原因發生了改變,為了保證查詢出來的資料與之前相同,則需要在多個地方進行修改,維護起來非常麻煩

解決辦法:定義檢視

2. 檢視是什麼

通俗的講,檢視就是一條SELECT語句執行後返回的結果集。所以我們在建立檢視的時候,主要的工作就落在建立這條SQL查詢語句上。

檢視是對若干張基本表的引用,一張虛表,查詢語句執行的結果,不儲存具體的資料(基本表資料發生了改變,檢視也會跟著改變);

方便操作,特別是查詢操作,減少複雜的SQL語句,增強可讀性;

3. 定義檢視

建議以v_開頭

create view 檢視名稱 as select語句;

4. 檢視檢視

查看錶會將所有的檢視也列出來

show tables;

5. 使用檢視

檢視的用途就是查詢

select * from v_stu_score;

6. 刪除檢視

drop view 檢視名稱;
例:
drop view v_stu_sco;

7. 檢視demo

   

8. 檢視的作用

  1. 提高了重用性,就像一個函式
  2. 對資料庫重構,卻不影響程式的執行
  3. 提高了安全效能,可以對不同的使用者
  4. 讓資料更加清晰

事務

1. 為什麼要有事務

事務廣泛的運用於訂單系統、銀行系統等多種場景

例如:

A使用者和B使用者是銀行的儲戶,現在A要給B轉賬500元,那麼需要做以下幾件事:

  1. 檢查A的賬戶餘額>500元;
  2. A 賬戶中扣除500元;
  3. B 賬戶中增加500元;

正常的流程走下來,A賬戶扣了500,B賬戶加了500,皆大歡喜。

那如果A賬戶扣了錢之後,系統出故障了呢?A白白損失了500,而B也沒有收到本該屬於他的500。

以上的案例中,隱藏著一個前提條件:A扣錢和B加錢,要麼同時成功,要麼同時失敗。事務的需求就在於此

所謂事務,它是一個操作序列,這些操作要麼都執行,要麼都不執行,它是一個不可分割的工作單位。

例如,銀行轉帳工作:從一個帳號扣款並使另一個帳號增款,這兩個操作要麼都執行,要麼都不執行。所以,應該把他們看成一個事務。事務是資料庫維護資料一致性的單位,在每個事務結束時,都能保持資料一致性

事務四大特性(簡稱ACID)

  • 原子性(Atomicity)
  • 一致性(Consistency)
  • 隔離性(Isolation)
  • 永續性(Durability)

以下內容出自《高效能MySQL》第三版,瞭解事務的ACID及四種隔離級有助於我們更好的理解事務運作。

下面舉一個銀行應用是解釋事務必要性的一個經典例子。假如一個銀行的資料庫有兩張表:支票表(checking)和儲蓄表(savings)。現在要從使用者Jane的支票賬戶轉移200美元到她的儲蓄賬戶,那麼至少需要三個步驟:

  1. 檢查支票賬戶的餘額高於或者等於200美元。
  2. 從支票賬戶餘額中減去200美元。
  3. 在儲蓄帳戶餘額中增加200美元。

上述三個步驟的操作必須打包在一個事務中,任何一個步驟失敗,則必須回滾所有的步驟。

可以用START TRANSACTION語句開始一個事務,然後要麼使用COMMIT提交將修改的資料持久儲存,要麼使用ROLLBACK撤銷所有的修改。事務SQL的樣本如下:

  1. start transaction;
  2. select balance from checking where customer_id = 10233276;
  3. update checking set balance = balance - 200.00 where customer_id = 10233276;
  4. update savings set balance = balance + 200.00 where customer_id = 10233276;
  5. commit;

一個很好的事務處理系統,必須具備這些標準特性:

  • 原子性(atomicity)

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

  • 一致性(consistency)

資料庫總是從一個一致性的狀態轉換到另一個一致性的狀態。(在前面的例子中,一致性確保了,即使在執行第三、四條語句之間時系統崩潰,支票賬戶中也不會損失200美元,因為事務最終沒有提交,所以事務中所做的修改也不會儲存到資料庫中。)

  • 隔離性(isolation)

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

  • 永續性(durability)

一旦事務提交,則其所做的修改會永久儲存到資料庫。(此時即使系統崩潰,修改的資料也不會丟失。)

事務命令

表的引擎型別必須是innodb型別才可以使用事務,這是mysql表的預設引擎

查看錶的建立語句,可以看到engine=innodb

-- 選擇資料庫
use jing_dong;
-- 檢視goods表
show create table goods;

開啟事務,命令如下:

  • 開啟事務後執行修改命令,變更會維護到本地快取中,而不維護到物理表中
begin;
或者
start transaction;

提交事務,命令如下

  • 將快取中的資料變更維護到物理表中
commit;

回滾事務,命令如下:

  • 放棄快取中變更的資料
rollback;

注意

  1. 修改資料的命令會自動的觸發事務,包括insert、update、delete
  2. 而在SQL語句中有手動開啟事務的原因是:可以進行多次資料的修改,如果成功一起成功,否則一起會滾到之前的資料

 


提交

  • 為了演示效果,需要開啟兩個終端視窗,使用同一個資料庫,操作同一張表(用到之前的jing_dong資料,可以回到mysql第3天中檢視)

step1:連線

  • 終端1:查詢商品分類資訊
select * from goods_cates;

step2:增加資料

  • 終端2:開啟事務,插入資料
begin;
insert into goods_cates(name) values('小霸王遊戲機');
  • 終端2:查詢資料,此時有新增的資料
select * from goods_cates;

step3:查詢

  • 終端1:查詢資料,發現並沒有新增的資料
select * from goods_cates;

step4:提交

  • 終端2:完成提交
commit;

step5:查詢

  • 終端1:查詢,發現有新增的資料
select * from goods_cates;

 


回滾

  • 為了演示效果,需要開啟兩個終端視窗,使用同一個資料庫,操作同一張表

step1:連線

  • 終端1
select * from goods_cates;

step2:增加資料

  • 終端2:開啟事務,插入資料
begin;
insert into goods_cates(name) values('小霸王遊戲機');
  • 終端2:查詢資料,此時有新增的資料
select * from goods_cates;

step3:查詢

  • 終端1:查詢資料,發現並沒有新增的資料
select * from goods_cates;

step4:回滾

  • 終端2:完成回滾
rollback;

step5:查詢

  • 終端1:查詢資料,發現沒有新增的資料
select * from goods_cates;