1. 程式人生 > >mysql資料庫--mysql事務及變數

mysql資料庫--mysql事務及變數

回顧

外來鍵:關聯關係(表與表之間,表中欄位指向另外一張表的主鍵)
	外來鍵條件:欄位型別必須一致,儲存引擎必須為Innodb。
	外來鍵約束:
		子表約束:不可插入父表不存在的資料。
		父表約束:三種約束模式(預設district,cascade,set null)
		經常使用的模式:on  delete  set  null  on  update  cascade

聯合查詢:union,多表合併和單表不同查詢條件
	聯合查詢使用order  by;select  語句必須使用括號,還必須配合limit語句

子查詢:查詢語句中有查詢語句
	分類:按位置(from,where和exists),按返回的用途(結果):標量,列,行和表

檢視:view
	節省SQL語句:安全性控制
	試圖本質:虛擬表,有結構無資料
	檢視資料操作:多表只能改,單表可以增刪改(增刪有條件限制)
	檢視演算法:undefined未定義,temptable臨時表和merge合併演算法。

檔案備份以及還原
	檔案備份:儲存引擎(myiasm適用)
	單表資料備份:只能備份資料
	SQL備份:備份的是SQL指令(mysqldump.exe客戶端備份)
	增量備份:備份系統日誌檔案

事務安全

事務transaction:一系列要發生的連續的操作。
事務安全:一種保護連續操作同時滿足(實現)的一種機制。為了保證資料的完整性。

需求:有一張銀行賬戶表,有A使用者給B使用者轉賬;A賬戶先減少,B賬戶增加,但是A操作完了之後斷電了導致A減少了B沒有增加。

-- 建立一個賬戶表
create table my_account(
number char(16) not null unique comment '賬戶',
name varchar(20) not null,
money decimal(10,2) default 0.0 comment '賬戶餘額'
)charset utf8;

-- 插入資料
insert into my_account values
('0000000000000001','張三',1000),
('0000000000000002','李四',2000);

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

事務操作:

事務操作分為兩種:自動事務(預設的)和手動事務
手動事務:
1.開啟事務:告訴系統以下所有的操作(寫)不要直接寫入到資料表,先存放到事務日誌
start  transaction;

在這裡插入圖片描述

2.進行事務操作:一系列操作
a)李四賬戶減少
-- 事務操作:李四賬戶減少
update my_account set money = money - 1000 where id = 2;

在這裡插入圖片描述

b)張三賬戶增加

在這裡插入圖片描述

3.關閉事務:選擇性的將日誌檔案中操作的結果儲存到資料表(同步),或者直接清空事務日誌(原來操作全部清空)
	a)提交事務:同步資料表(操作成功):commit
	b)回滾事務:直接清空日誌表(操作失敗):rollback
-- 提交事務
commit;

在這裡插入圖片描述

事務原理:

事務操作原理:事務開啟之後,所有的操作都會臨時儲存到事務日誌中,事務日誌只有在得到commit命令才會同步到資料表,
其他任何情況都會清空(rollback,斷電,突然斷開等)

在這裡插入圖片描述

事務的回滾點

回滾點:在某一個成功的操作完成之後,後續的操作有可能成功有可能失敗,但是不管成功還是失敗,前面的操作都已經成功,
可以在當前位置設定一個回滾點,可以供後續失敗操作返回到該位置而不是返回所有操作,這個點稱為回滾點。
設定回滾點語法:savepoint  回滾點名字;

-- 回滾點操作開啟事務
start transaction;

-- 事務處理1:張三加錢
update my_account set money = money + 10000 where id = 1;

-- 檢視結果
select * from my_account;

-- 設定回滾點
savepoint sp1;

-- 檢視結果
select * from my_account;

在這裡插入圖片描述


回到回滾點語法:rollback  to  回滾點名字;
-- 銀行扣稅
update my_account set money = money - 10000* 0.05 where id = 2;  -- 錯誤

select * from my_account;

-- 回滾到回滾點
rollback to sp1;

select * from my_account;

在這裡插入圖片描述

-- 繼續操作
update my_account set money = money - 10000* 0.05 where id = 1;

-- 檢視結果
select * from my_account;

-- 提交資料改變資料表
commit;

在這裡插入圖片描述

自動事務處理:

在mysql中預設的都是自動事務處理,使用者操作完成後會立即同步到資料表中
自動事務:系統通過autocommit變數控制
show  variables like  'autocommit';

在這裡插入圖片描述

關閉自動提交:set  autocommit  = off/0;
-- 關閉事務自動提交
set autocommit = 0;
show variables like 'autocommit';

在這裡插入圖片描述

再次直接寫操作

在這裡插入圖片描述

自動關閉之後需要手動來選擇處理:commit 提交,rollback 回滾。
在這裡插入圖片描述

注意:通常會使用自動事務,不可能在使用資料庫的時候每次都提交會造成很多麻煩

在這裡插入圖片描述

事務特性:

事務有四大特性:ACID
	A:atomic原子性,事務的整個操作是一個整體,不可分割要不全部成功要不全部失敗。
	C:consistency,一致性,事務操作的前後,資料表中的資料沒有變化。
	I:isolation,隔離性,事務操作是相互隔離,不受影響
	D:durability,永續性,資料一旦提交不可改變

在這裡插入圖片描述

鎖機制:Innodb預設是行鎖,但是如果在事務操作的過程中沒有使用到索引,那麼系統會自動全表檢索資料,自動升級為表鎖。
行鎖:只有當前行被鎖住別的使用者不能操作
表鎖:整張表被鎖住,別的使用者不能操作
等待解鎖使用commit或者rollback來進行釋放

在這裡插入圖片描述

變數:

變數分為兩種:系統變數和自定義變數

系統變數

系統定義好的變數:大部分的時候使用者根本不需要使用系統變數:系統變數是用來控制伺服器的變現的。
如:autocommit,auto_increment——increment等。
檢視系統變數:show variables; -- 檢視所有系統變數

在這裡插入圖片描述

檢視具體變數值:任何一個有資料返回的內容都是由select檢視
select  @@變數名;

在這裡插入圖片描述

修改系統變數

修改系統變數分為兩種方式:會話級別和全域性級別
會話級別:臨時修改,當前客戶端當次連線有效
set  變數名  =  值;
set  autocommit = 0;或者set  @@autocommit = 0;

在這裡插入圖片描述
在這裡插入圖片描述

全域性級別:

一次修改永久有效,對所有客戶端有效。一般不會修改
set  global autocommit = 0;

在這裡插入圖片描述

自定義變數

定義變數:為了區分系統變數,規定使用者自定義變數必須使用一個@符號
set  @變數名  =  值;
檢視依舊使用select
select  @變數名;

在這裡插入圖片描述

在MySQL中,“=”會預設的當做比較符號處理(很多地方),mysql為了區分比較和賦值的概念重新定義了一個新的賦值符號:  
:=(冒號+等於號)

在這裡插入圖片描述

mysql允許從資料表中獲取資料然後賦值給變數兩種方式:
方案一:邊賦值邊檢視結果
select  @變數名  :=  欄位名  from  資料來源; -- 從欄位中取值賦值給變數名,如果使用=會變成比較的意思
select * from my_student;
-- 從表中獲取資料賦值給變數,使用=號
select @name = name,name from my_student;
-- 從表中獲取資料賦值給變數,使用:=號
select @name := name,name from my_student;

在這裡插入圖片描述

方案2:只有賦值不看結果,要求很嚴格,資料記錄最多隻獲取一條:mysql不支援陣列
select  欄位列表  from  表名  into  變數列表;
所有自定義變數都是會話級別,當前客戶端當次連線有效

在這裡插入圖片描述

所有自定義變數不區分資料庫由使用者決定:
在這裡插入圖片描述