一、事務(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 @@變量名;-- 查看具體變量值


(2)修改系統(tǒng)變量
- 會話級別:
臨時修改,當前客戶端當次連接有效
set 變量名 = 值;
set @@變量名 = 值;

- 全局級別:
一次修改永久修改(對所有客戶端都生效)
set global 變量名 = 值;

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ā)器:訂單生成一個,商品庫存減少

(2)查看觸發(fā)器
查看所有觸發(fā)器
show trigger;
或
show trigger like 'pattern';
(為了看的更清楚加\G可以使橫縱反轉)

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

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

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

(4)修改觸發(fā)器&&刪除觸發(fā)器
觸發(fā)器不能修改,只能先刪除,后新增
drop trigger 觸發(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ā)生之后的結果

