mysql資料庫--mysql事務及變數
阿新 • • 發佈:2018-11-26
回顧
外來鍵:關聯關係(表與表之間,表中欄位指向另外一張表的主鍵) 外來鍵條件:欄位型別必須一致,儲存引擎必須為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 變數列表;
所有自定義變數都是會話級別,當前客戶端當次連線有效
所有自定義變數不區分資料庫由使用者決定: