事務(wù)
事務(wù)其實就是針對一組Sql語句辽社,要么全部成功伟墙,要么全都失敗,就比如銀行轉(zhuǎn)賬爹袁,一個人轉(zhuǎn)錢远荠,一個人收錢,要么就是轉(zhuǎn)錢成功失息,收錢也成功譬淳,要么就是轉(zhuǎn)錢失敗,收錢也失敗盹兢,不會存在轉(zhuǎn)錢成功邻梆,收錢失敗的情況;
事務(wù)的使用:就是把一組sql語句放進事務(wù)里面绎秒,當sql語句都執(zhí)行成功浦妄,執(zhí)行提交。當有一條sql執(zhí)行失敗见芹,執(zhí)行回滾剂娄;
回滾:有兩個用戶X,Y;X給Y轉(zhuǎn)賬,X轉(zhuǎn)錢成功玄呛,Y卻沒有收到錢阅懦,所以這種情況應(yīng)該回滾到X轉(zhuǎn)錢成功之前的數(shù)據(jù);
首先開啟事務(wù):start transaction,,,然后執(zhí)行Sql語句徘铝,出錯耳胎,回滾rollback;
提交:start transaction,,,執(zhí)行sql語句惯吕,,怕午,成功废登,,郁惜,commit提交堡距;
這里需要注意一點,就是當我們開起事務(wù)之后扳炬,在執(zhí)行回滾或者提交之前操作的數(shù)據(jù)都只是在內(nèi)存里面發(fā)生的變化吏颖,磁盤上面的數(shù)據(jù)并沒有變化,只有當執(zhí)行了回滾或者提交磁盤數(shù)據(jù)才會發(fā)生改變恨樟;
sql語句都執(zhí)行成了半醉,所以就commit;
事務(wù)的特點:
1.原子性:要么都成功,要么全失敗
2.一致性:讓數(shù)據(jù)保持一致性劝术,增多少呛凶,減多少挫酿,
3.隔離性:多個事務(wù)并發(fā)執(zhí)行,每個事務(wù)是獨立執(zhí)行
4.持久性:一個事務(wù)執(zhí)行成功,改變的應(yīng)該是磁盤數(shù)據(jù)往弓,而不是內(nèi)存數(shù)據(jù)的變化比搭;
注意點:事務(wù)默認是關(guān)閉的募判,還有一個自動提交的屬性auto_commit默認是開啟的伦意,也就是說不開啟事務(wù)的情況下,默認提交也是自動開啟的零酪,插入數(shù)據(jù)的時候就會直接插入磁盤冒嫡,如果把默認提交關(guān)閉,那么每次插入數(shù)據(jù)都只是在內(nèi)存操作四苇,還需要commit才能插入磁盤孝凌;還有一點就是myisam引擎不支持事務(wù),如果要用事務(wù)的話必須使用innodb引擎月腋;
默認是開啟了自動提交蟀架,所以我們沒用事務(wù)的時候直接就插進了磁盤;
當我們把自動提交關(guān)閉以后榆骚,就每次都需要commit了片拍;
沒有執(zhí)行commit,沒有插入磁盤
執(zhí)行commit妓肢,提交到了磁盤穆碎;
數(shù)據(jù)庫編程
所謂數(shù)據(jù)庫編程,就是把sql語句封裝在函數(shù)里面职恳,然后把函數(shù)存儲到mysql所禀,以后只需要傳入?yún)?shù),調(diào)用函數(shù)就可以了放钦;用數(shù)據(jù)庫編程效率比較高色徘;
由于函數(shù)的語句的結(jié)束符是;,而sql語句的結(jié)束符也是;操禀,所以為了避免沖突褂策,首先把sql的結(jié)束符修改,用delimiter? 符號颓屑,修改sql結(jié)束符斤寂;
語法: create procedure? 函數(shù)名(參數(shù))
? ? ? ? ? ? begin
? ? ? ? ? ? sql語句;
? ? ? ? ? ? end 結(jié)束符
call 函數(shù)名(參數(shù))
查詢數(shù)據(jù)庫函數(shù):
視圖
視圖其實就是一張臨時表揪惦,里面存了你想讓別人查出來的數(shù)據(jù)遍搞,有一些敏感數(shù)據(jù)如果你不想讓別人查詢,那他是查不出來的器腋,比如說有家公司需要查詢你的數(shù)據(jù)庫溪猿,但是你不想把所有的信息都給他,那么你只需要給他提供一張視圖表就可以了纫塌,你把他所需要的數(shù)據(jù)放進是視圖表诊县,那么他就只能查到視圖表里面的數(shù)據(jù)
從下面就可以看出,我們其實是先執(zhí)行了一些查詢語句措左,然后把查詢到的數(shù)據(jù)給了視圖view依痊,后面在查詢視圖,就只能查到視圖這張臨時表的數(shù)據(jù)了怎披,查不到原表的數(shù)據(jù)胸嘁;視圖只能作用于查詢,不能作用在其他語句上钳枕;
觸發(fā)器:
trigger,見名知意缴渊,觸發(fā)器的意思就是當執(zhí)行了某些操作后會觸發(fā)某操作,
語法? 觸發(fā)器只能針對增刪改鱼炒,
create trigger 觸發(fā)器名 after|befroe? ? insert|update|delete on 表名? fro each row
begin
sql 語句
end;
我們知道當統(tǒng)計表數(shù)據(jù)的時候一般是用count(*)函數(shù)衔沼,但是這個函數(shù)效率不高,所以我們就用觸發(fā)器昔瞧,往另一張統(tǒng)計表寫入數(shù)據(jù)總量指蚁,到時候查詢統(tǒng)計表就可以得到數(shù)據(jù)的總數(shù),而不是用count()函數(shù)自晰,這樣效率會高很多
比如我們需要統(tǒng)計學(xué)生的總數(shù):
當我們往學(xué)生表插入一條數(shù)據(jù)凝化,就讓統(tǒng)計表加一,刪除一條數(shù)據(jù)酬荞,就讓統(tǒng)計表減一搓劫,最后我們只需要查詢統(tǒng)計表就可以得出數(shù)量總數(shù)瞧哟,這樣效率是最高的;