真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

MySQL(5)-mysql的事務(wù)與觸發(fā)器功能

? ? ? ? ?本篇博客介紹的是MySQL的事務(wù)功能和觸發(fā)器功能 , 以及它們的用法 .

10年積累的成都做網(wǎng)站、成都網(wǎng)站制作經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有聶榮免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

?一 . MySQL事務(wù)

? ? ? ? ?

事務(wù)是一組原子性的SQL查詢,或者說(shuō)是一個(gè)獨(dú)立的工作單元。事務(wù)中的所有操作要么全部執(zhí)行成功,要么全部執(zhí)行失敗。

在MySQL中 , 采用事務(wù)功能可以實(shí)現(xiàn)有選擇性的對(duì)表中的數(shù)據(jù)操作做回滾 , 提交 , 類似于word中的記憶功能 (做錯(cuò)了可以CTRL+Z撤銷)

MySQL默認(rèn)處理任務(wù)的原則 : 執(zhí)行增 , 刪 , 改操作會(huì)自動(dòng)保存數(shù)據(jù)到庫(kù) , 表記錄中

生活實(shí)例: 好比玩游戲 , 當(dāng)玩家在玩游戲充值時(shí) , 假如錢(qián)扣了 , 道具卻沒(méi)有立即到手 , 這樣顯然會(huì)大大減低玩家對(duì)游戲的體驗(yàn) , 最后導(dǎo)致的雙方的不開(kāi)心 ,出現(xiàn)這種情況說(shuō)的就是數(shù)據(jù)的事務(wù)沒(méi)有保障 ; 假如出現(xiàn)這種情況事務(wù)功能可以解決這種問(wèn)題 , 也就是道具沒(méi)有到賬的情況 , 玩家賬戶的余額也是不會(huì)扣除的

MySQL的事務(wù)處理主要有兩中方法:

1 . 用BEGIN , ROLLBACK , COMMIT 來(lái)實(shí)現(xiàn)

begin :開(kāi)始一個(gè)事務(wù) , 然后執(zhí)行create , update , insert等命令對(duì)數(shù)據(jù)做出操作?

rollback :事務(wù)回滾 (相當(dāng)于word中的ctrl+z撤銷)

commit :事務(wù)確認(rèn) (提交 , 相當(dāng)于word中的ctrl+s保存) ? ?

2 . 通過(guò)set來(lái)改變mysql的自動(dòng)提交模式

注 : MYSQL默認(rèn)是自動(dòng)提交的,也就是你提交一個(gè)QUERY,它就直接執(zhí)行!我們可以通過(guò)
show ? variables \G? ? ? ?查看MYSQL環(huán)境變量
show ? variables ?like ?'autocom%'; ? ? 查看autocommit環(huán)境變量的狀態(tài)
set ?autocommit=0?? 禁止自動(dòng)提交(臨時(shí)設(shè)置) ,即自動(dòng)開(kāi)啟事務(wù)功能,并不需要用begin開(kāi)始事務(wù),但是必須用commit提交操作,或用rollback撤消操作 , 此時(shí)查看autocommit環(huán)境變量 ?, value為OFF:

MySQL(5)-mysql的事務(wù)與觸發(fā)器功能

set autocommit=1 ??開(kāi)啟自動(dòng)提交(必須用begin開(kāi)始一個(gè)事務(wù),用commit或rollback結(jié)束事務(wù))來(lái)實(shí)現(xiàn)事務(wù)的處理 .查看auto commit值為狀態(tài)ON.
? ? ? ? ? ? ? ? ?

但注意當(dāng)你用 set autocommit=0 的時(shí)候,你以后所有的SQL都將做為事務(wù)處理,直到你用commit確認(rèn)或rollback結(jié)束,當(dāng)你結(jié)束這個(gè)事務(wù)的同時(shí)也開(kāi)啟了個(gè)新的事務(wù)!按第一種方法只將當(dāng)前的作為一個(gè)事務(wù)!個(gè)人推薦使用第一種方法!
MYSQL中只有INNODB和BDB類型的數(shù)據(jù)表才能支持事務(wù)處理!其他的類型是不支持的!
注意:事務(wù)功能只對(duì)表的insert、delete、update這些操作有效。

實(shí)例: 進(jìn)入數(shù)據(jù)庫(kù)中 , 使用test數(shù)據(jù)庫(kù) , 創(chuàng)建一張testdb表 , 查看表中的數(shù)據(jù) , 然后開(kāi)啟事務(wù)功能 , 插入2條數(shù)據(jù) , 提交事務(wù) , 查看表中的數(shù)據(jù) ; 然后開(kāi)啟新事務(wù) , 插入一條記錄 , 做回滾操作(撤銷) , 查看表中的數(shù)據(jù)

? ? ? ? ? ? ??

第一步 : 在test數(shù)據(jù)庫(kù)中創(chuàng)建testdb表 , 查看表中數(shù)據(jù)

MySQL(5)-mysql的事務(wù)與觸發(fā)器功能

第二步 : 開(kāi)啟事務(wù)功能 , 并插入數(shù)據(jù) ,然后提交

MySQL(5)-mysql的事務(wù)與觸發(fā)器功能

第三步 :?開(kāi)啟新事務(wù) , 插入一條記錄 , 做回滾操作(撤銷) , 并查看表中的數(shù)據(jù)

MySQL(5)-mysql的事務(wù)與觸發(fā)器功能


?二 . mysql觸發(fā)器功能

觸發(fā)器(trigger)是一個(gè)特殊的存儲(chǔ)過(guò)程,它的執(zhí)行不是由程序調(diào)用,也不是手工啟動(dòng),而是由事件(event)來(lái)觸發(fā),
?比如當(dāng)對(duì)A表進(jìn)行操作事件( insert,delete, update)時(shí)就會(huì)激活它執(zhí)行。觸發(fā)器經(jīng)常用于加強(qiáng)數(shù)據(jù)的完整性約束和業(yè)務(wù)規(guī)則等。

用生活實(shí)例來(lái)說(shuō): 在A處按電腦開(kāi)機(jī)鍵,電腦就開(kāi)機(jī)了。
? ? ? ? ? ? ? ? ? ? ? ? ?在A處按燈的開(kāi)關(guān),B處天花板上的燈就亮了。

? ? ? ? ? ? ? ? ? ? ? ? ?在A處打卡 , 通道門(mén)就開(kāi)了

創(chuàng)建觸發(fā)器(trigger)語(yǔ)法 :

CREATE ?TRIGGER ?觸發(fā)器名稱 ?BEFORE|AFTER ?觸發(fā)事件

ON ?表名 FOR ?EACH ?ROW

BEIGN

? ? ? ? ?觸發(fā)器程序體 ;

END ?

? ? ? ? <觸發(fā)器名稱> 最多64個(gè)字符,它和MySQL中其他對(duì)象的命名方式一樣
? ? ? ??{ BEFORE | AFTER } 觸發(fā)器時(shí)機(jī)
? ? ? ??{ INSERT | UPDATE | DELETE }? 觸發(fā)的事件
? ? ? ? ON <表名稱>? 標(biāo)識(shí)建立觸發(fā)器的表名,即在哪張表上建立觸發(fā)器
? ? ? ? FOR EACH ROW? ? ? ?觸發(fā)器的執(zhí)行間隔:FOR EACH ROW子句通知觸發(fā)器 每隔一行 執(zhí)行一次動(dòng)作,而不是對(duì)整個(gè)表執(zhí)行一次
? ? ? ?<觸發(fā)器程序體> 要觸發(fā)的SQL語(yǔ)句:可用順序,判斷,循環(huán)等語(yǔ)句實(shí)現(xiàn)一般程序需要的邏輯功能

?? ? ? ?

實(shí)例 :在test數(shù)據(jù)庫(kù)中創(chuàng)建一張stu學(xué)生表和一張統(tǒng)計(jì)stu表的人數(shù)的stu_total表 ?, 然后創(chuàng)建student表發(fā)生改變 , stu_total表就發(fā)生改變的觸發(fā)器 , 對(duì)stu表進(jìn)行操作 , 然后查看stu_total因觸發(fā)器會(huì)有什么變化

第一步 :創(chuàng)建這兩張表 , 并查看表中的數(shù)據(jù)

MySQL(5)-mysql的事務(wù)與觸發(fā)器功能

第二步 : 創(chuàng)建觸發(fā)器stu_insert_trigger 和觸發(fā)器stu_delete_trigger

MySQL(5)-mysql的事務(wù)與觸發(fā)器功能

第三步 : 再次定義回操作結(jié)束符( ; ) ,并查看觸發(fā)器

MySQL(5)-mysql的事務(wù)與觸發(fā)器功能

第四步 : 檢測(cè)觸發(fā)器結(jié)果

MySQL(5)-mysql的事務(wù)與觸發(fā)器功能

第五步 : 對(duì)stu表進(jìn)行delete操作 , 再次驗(yàn)證實(shí)驗(yàn)效果

MySQL(5)-mysql的事務(wù)與觸發(fā)器功能

? ? ? ? ? ??

從實(shí)驗(yàn)結(jié)果可以看到 , 當(dāng)我們對(duì)stu表進(jìn)行數(shù)據(jù)的增刪操作時(shí) , 定義觸發(fā)器后 , stu_total表會(huì)根據(jù)stu表的不同操作發(fā)生不同變化 !

? ? ? ??

刪除觸發(fā)器 :??DROP TRIGGER 解發(fā)器名稱

? ? ?

注 :此例的觸發(fā)器故障bug:如果stu_total表中的初始統(tǒng)計(jì)數(shù)據(jù)不正確,以上定義的這個(gè)觸發(fā)器會(huì)導(dǎo)致stu_total表中統(tǒng)計(jì)的total值跟stu表中的總記錄數(shù)信息不對(duì)稱,所以這個(gè)觸發(fā)器是有問(wèn)題的。正確的解法是用count函數(shù)來(lái)統(tǒng)計(jì)stu表中的記錄數(shù),不應(yīng)該用加1或減1這種做法。

優(yōu)化過(guò)的正確觸發(fā)器:

?#?觸發(fā)器stu_insert_trigger
?
?drop??triggers??stu_insert_trigger;
?delimiter???$$
?create?trigger?stu_insert_trigger??after?insert
?????on?stu?for?each?row
?????BEGIN
??????????update?stu_total?set?total=(select??count(*)??from??stu);
?????END$$
?delimiter??;

? ? ? ?

? ? ? ? ? ? ??


網(wǎng)站標(biāo)題:MySQL(5)-mysql的事務(wù)與觸發(fā)器功能
URL分享:http://weahome.cn/article/gssdjs.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部