事務(wù)
事務(wù)其實(shí)就是針對(duì)一組Sql語句,要么全部成功,要么全都失敗,就比如銀行轉(zhuǎn)賬,一個(gè)人轉(zhuǎn)錢,一個(gè)人收錢,要么就是轉(zhuǎn)錢成功,收錢也成功,要么就是轉(zhuǎn)錢失敗,收錢也失敗,不會(huì)存在轉(zhuǎn)錢成功,收錢失敗的情況;
事務(wù)的使用:就是把一組sql語句放進(jìn)事務(wù)里面,當(dāng)sql語句都執(zhí)行成功,執(zhí)行提交。當(dāng)有一條sql執(zhí)行失敗,執(zhí)行回滾;
回滾:有兩個(gè)用戶X,Y;X給Y轉(zhuǎn)賬,X轉(zhuǎn)錢成功,Y卻沒有收到錢,所以這種情況應(yīng)該回滾到X轉(zhuǎn)錢成功之前的數(shù)據(jù);
首先開啟事務(wù):start transaction,,,然后執(zhí)行Sql語句,出錯(cuò),回滾rollback;

提交:start transaction,,,執(zhí)行sql語句,,,成功,,,commit提交;
這里需要注意一點(diǎn),就是當(dāng)我們開起事務(wù)之后,在執(zhí)行回滾或者提交之前操作的數(shù)據(jù)都只是在內(nèi)存里面發(fā)生的變化,磁盤上面的數(shù)據(jù)并沒有變化,只有當(dāng)執(zhí)行了回滾或者提交磁盤數(shù)據(jù)才會(huì)發(fā)生改變;

sql語句都執(zhí)行成了,所以就commit;

事務(wù)的特點(diǎn):
1.原子性:要么都成功,要么全失敗
2.一致性:讓數(shù)據(jù)保持一致性,增多少,減多少,
3.隔離性:多個(gè)事務(wù)并發(fā)執(zhí)行,每個(gè)事務(wù)是獨(dú)立執(zhí)行
4.持久性:一個(gè)事務(wù)執(zhí)行成功,改變的應(yīng)該是磁盤數(shù)據(jù),而不是內(nèi)存數(shù)據(jù)的變化;
注意點(diǎn):事務(wù)默認(rèn)是關(guān)閉的,還有一個(gè)自動(dòng)提交的屬性auto_commit默認(rèn)是開啟的,也就是說不開啟事務(wù)的情況下,默認(rèn)提交也是自動(dòng)開啟的,插入數(shù)據(jù)的時(shí)候就會(huì)直接插入磁盤,如果把默認(rèn)提交關(guān)閉,那么每次插入數(shù)據(jù)都只是在內(nèi)存操作,還需要commit才能插入磁盤;還有一點(diǎn)就是myisam引擎不支持事務(wù),如果要用事務(wù)的話必須使用innodb引擎;
默認(rèn)是開啟了自動(dòng)提交,所以我們沒用事務(wù)的時(shí)候直接就插進(jìn)了磁盤;

當(dāng)我們把自動(dòng)提交關(guān)閉以后,就每次都需要commit了;
沒有執(zhí)行commit,沒有插入磁盤

執(zhí)行commit,提交到了磁盤;

數(shù)據(jù)庫編程
所謂數(shù)據(jù)庫編程,就是把sql語句封裝在函數(shù)里面,然后把函數(shù)存儲(chǔ)到mysql,以后只需要傳入?yún)?shù),調(diào)用函數(shù)就可以了;用數(shù)據(jù)庫編程效率比較高;
由于函數(shù)的語句的結(jié)束符是;,而sql語句的結(jié)束符也是;,所以為了避免沖突,首先把sql的結(jié)束符修改,用delimiter? 符號(hào),修改sql結(jié)束符;
語法: create procedure? 函數(shù)名(參數(shù))
? ? ? ? ? ? begin
? ? ? ? ? ? sql語句;
? ? ? ? ? ? end 結(jié)束符
call 函數(shù)名(參數(shù))

查詢數(shù)據(jù)庫函數(shù):

視圖
視圖其實(shí)就是一張臨時(shí)表,里面存了你想讓別人查出來的數(shù)據(jù),有一些敏感數(shù)據(jù)如果你不想讓別人查詢,那他是查不出來的,比如說有家公司需要查詢你的數(shù)據(jù)庫,但是你不想把所有的信息都給他,那么你只需要給他提供一張視圖表就可以了,你把他所需要的數(shù)據(jù)放進(jìn)是視圖表,那么他就只能查到視圖表里面的數(shù)據(jù)
從下面就可以看出,我們其實(shí)是先執(zhí)行了一些查詢語句,然后把查詢到的數(shù)據(jù)給了視圖view,后面在查詢視圖,就只能查到視圖這張臨時(shí)表的數(shù)據(jù)了,查不到原表的數(shù)據(jù);視圖只能作用于查詢,不能作用在其他語句上;

觸發(fā)器:
trigger,見名知意,觸發(fā)器的意思就是當(dāng)執(zhí)行了某些操作后會(huì)觸發(fā)某操作,
語法? 觸發(fā)器只能針對(duì)增刪改,
create trigger 觸發(fā)器名 after|befroe? ? insert|update|delete on 表名? fro each row
begin
sql 語句
end;
我們知道當(dāng)統(tǒng)計(jì)表數(shù)據(jù)的時(shí)候一般是用count(*)函數(shù),但是這個(gè)函數(shù)效率不高,所以我們就用觸發(fā)器,往另一張統(tǒng)計(jì)表寫入數(shù)據(jù)總量,到時(shí)候查詢統(tǒng)計(jì)表就可以得到數(shù)據(jù)的總數(shù),而不是用count()函數(shù),這樣效率會(huì)高很多
比如我們需要統(tǒng)計(jì)學(xué)生的總數(shù):
當(dāng)我們往學(xué)生表插入一條數(shù)據(jù),就讓統(tǒng)計(jì)表加一,刪除一條數(shù)據(jù),就讓統(tǒng)計(jì)表減一,最后我們只需要查詢統(tǒng)計(jì)表就可以得出數(shù)量總數(shù),這樣效率是最高的;
