事務 變量 觸發(fā)器

一、事務(transaction)

事務就是一組有著內(nèi)在邏輯聯(lián)系的sql命令。

1.事務安全

一種保護連續(xù)操作同時滿足(實現(xiàn))的一種機制
事務安全的意義在于保證數(shù)據(jù)操作的完整性。

事務操作

  • 自動事務(默認的)
  • 手動事務

1.開啟事務:系統(tǒng)以下的所有操作不直接寫入到數(shù)據(jù)表,先存放到事務日志
start transaction;
2.進行事務操作:一系列操作
3.關閉事務:選擇性的將日志中操作的結果保存到數(shù)據(jù)表(同步)或者說直接清空事務日志(原來操作全部清空)
a)提交事務:同步數(shù)據(jù)表
commit;
b)回滾事務:直接清空日志表
rollback;

開啟事務
事務操作
提交事務

2.事務原理
事務操作原理:事務開啟之后,所有的操作都會臨時保存到事務日志,事務日志只有在得到commit命令才會同步到數(shù)據(jù)表,其他任何情況都會清空(rollback,斷電,斷開連接)。

3.回滾點
在某個成功的操作之后,后續(xù)的操作有可能成功有可能失敗,但是不管成功還是失敗,前面的操作都已經(jīng)成功:可以在當前成功的位置,設置一個點:可以供后續(xù)失敗操作返回到該位置,而不是返回所有操作,這個點稱為回滾點。

  • 設置回滾點語法:
    savepoint 回滾點名;
  • 回到回滾點語法:
    rollback to 回滾點名;
設置回滾點
回到回滾點

4.自動事務處理
在MySQL中:默認的都是自動事務處理,用戶操作完會立即同步到數(shù)據(jù)表中

自動事務:系統(tǒng)通過autocommit變量控制
show variables like ‘a(chǎn)utocommit’;

自動事務

關閉自動提交:
set autocommit = 0;

關閉自動提交

自動提交的栗子:

自動提交的栗子

自動關閉之后,需要手動來選擇處理:
commit 提交,rollback 回滾

手動提交

5.事務特性

事務有四大特性:ACID

  • A:atomic 原子性,事務的整個操作是一個整體,不可分割,要么全部成功,要么全部失敗。
  • C:consistency 一致性,事務操作的前后,數(shù)據(jù)表中的數(shù)據(jù)沒有變化
  • I:isolation 隔離性,事務操作是相互隔離不受影響的
  • D:durability 持久性,數(shù)據(jù)一旦提交,不可改變。

鎖機制:innodb默認是行鎖。但是如果在事務操作的過程中,沒有使用到索引,那么系統(tǒng)會自動全表解鎖數(shù)據(jù),自動升級為表鎖

  • 行鎖:只有當前行被鎖住,別的用戶不能操作。
  • 表鎖:整張表被鎖住,別的用戶都不能操作。
鎖機制

二、變量

變量分為兩種

  • 系統(tǒng)變量

  • 自定義變量

1.系統(tǒng)變量

系統(tǒng)定義好的變量。系統(tǒng)變量是用來控制服務器的表現(xiàn)的
eg:autocommit,auto_increment等

(1)查看系統(tǒng)變量
show variables; -- 查看所有系統(tǒng)變量
select @@變量名;-- 查看具體變量值

查看所有系統(tǒng)變量
查看具體變量值

(2)修改系統(tǒng)變量

  • 會話級別:
    臨時修改,當前客戶端當次連接有效
    set 變量名 = 值;
    set @@變量名 = 值;
會話級別系統(tǒng)變量修改
  • 全局級別:
    一次修改永久修改(對所有客戶端都生效)
    set global 變量名 = 值;
全局級別系統(tǒng)變量修改

2.自定義變量
用戶自己定義的變量
(1)定義變量
set @變量名 := 值;

定義自定義變量

(2)查看自定義變量
select @變量名;

查看自定義變量

(3)MySQL允許從數(shù)據(jù)表中獲取數(shù)據(jù),然后賦值給變量

  • 邊賦值邊查看結果
    select @變量名 = 字段名 from 數(shù)據(jù)源; --字段中取值賦值給變量名
邊賦值邊查看結果
邊賦值變查看結果
  • 只有賦值不看結果
    數(shù)據(jù)記錄只允許獲取一條,因為MySQL不支持數(shù)組
    select 字段列表 from 表名 into 變量列表;
只有賦值不看結果

所有自定義的變量都是會話級別的,當前客戶端當次連接有效

三、觸發(fā)器(trigger)

事先為某張表綁定好一段代碼,當表中的某些東西發(fā)生改變的時候(增刪改)系統(tǒng)會自動出發(fā)代碼,執(zhí)行。

觸發(fā)器:事件類型,出發(fā)時間,觸發(fā)對象
一張表中只能擁有一種觸發(fā)時間的一種觸發(fā)類型的觸發(fā)器:最多一張表能有6個觸發(fā)器。

  • 事件類型(增刪改)
  • 觸發(fā)時間(前before后after)
  • 觸發(fā)對象(表中的每一條記錄 行)

(1)創(chuàng)建觸發(fā)器

觸發(fā)器基本語法

delimiter 自定義符號    -- 后續(xù)代碼只有碰到自定義符號才算結束
create trigger 觸發(fā)器名 觸發(fā)時間 事件類型 on 表名 for each row
begin    -- 代表開始
  -- 觸發(fā)器內(nèi)容:每行內(nèi)容都必須使用語句結束符“;”
end      -- 代表結束
  -- 語句結束符
自定義符號

-- 將臨時結束符修正過來 
delimiter   ;

舉個栗子
創(chuàng)建一個訂單表my_goods(id name price inv(庫存數(shù)量))
創(chuàng)建一個商品表my_order(id g_id g_number)
觸發(fā)器:訂單生成一個,商品庫存減少

觸發(fā)器栗子

(2)查看觸發(fā)器

查看所有觸發(fā)器
show trigger;

show trigger like 'pattern';

(為了看的更清楚加\G可以使橫縱反轉)


查看所有觸發(fā)器

查看觸發(fā)器創(chuàng)建語句
show create trigger 觸發(fā)器;

查看觸發(fā)器創(chuàng)建語句

所有觸發(fā)器都會保存到一張表中:information_schema.trigger 中

觸發(fā)器所存在的表

(3)使用觸發(fā)器

觸發(fā)器:當指定的事情發(fā)生時,會自動觸發(fā)

觸發(fā)器的使用

(4)修改觸發(fā)器&&刪除觸發(fā)器

觸發(fā)器不能修改,只能先刪除,后新增

drop trigger 觸發(fā)器名;

刪除觸發(fā)器

(5)觸發(fā)器記錄
觸發(fā)器記錄:不管觸發(fā)器是否觸發(fā)了,只要當某種操作準備操作,系統(tǒng)就會將當前要操作的記錄的當前狀態(tài)和即將執(zhí)行之后新的狀態(tài)給保留下來,供觸發(fā)器使用。
要操作的當前狀態(tài)保存到old中,操作之后的可能形態(tài)保存給new。

old 代表舊記錄
new 代表新紀錄
刪除的時候沒有new,插入的時候沒有old

使用方式
old.字段名
new.字段名

new 代表的是假設發(fā)生之后的結果

觸發(fā)器記錄
觸發(fā)器驗證
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,555評論 19 139
  • 1.1 基本結構 PL/SQL程序由三個塊組成,即聲明部分、執(zhí)行部分、異常處理部分。 1.2 命名規(guī)則 1.3 記...
    慢清塵閱讀 4,070評論 3 14
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內(nèi)部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,697評論 18 399
  • 國家電網(wǎng)公司企業(yè)標準(Q/GDW)- 面向對象的用電信息數(shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 12,413評論 6 13
  • 我們很多人都有過這樣的經(jīng)歷,出去外面吃飯,不知道選擇吃什么,一方面想要吃到質量好的食物,還想要到到最近流行的飯店去...
    觴詠閱讀 400評論 0 5

友情鏈接更多精彩內(nèi)容