亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL(5)-mysql的事務與觸發器功能

發布時間:2020-06-26 23:43:46 來源:網絡 閱讀:818 作者:gsshang 欄目:MySQL數據庫

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


?一 . MySQL事務

? ? ? ? ?

事務是一組原子性的SQL查詢,或者說是一個獨立的工作單元。事務中的所有操作要么全部執行成功,要么全部執行失敗

在MySQL中 , 采用事務功能可以實現有選擇性的對表中的數據操作做回滾 , 提交 , 類似于word中的記憶功能 (做錯了可以CTRL+Z撤銷)

MySQL默認處理任務的原則 : 執行增 , 刪 , 改操作會自動保存數據到庫 , 表記錄中

生活實例 : 好比玩游戲 , 當玩家在玩游戲充值時 , 假如錢扣了 , 道具卻沒有立即到手 , 這樣顯然會大大減低玩家對游戲的體驗 , 最后導致的雙方的不開心 ,出現這種情況說的就是數據的事務沒有保障 ; 假如出現這種情況事務功能可以解決這種問題 , 也就是道具沒有到賬的情況 , 玩家賬戶的余額也是不會扣除的


MySQL的事務處理主要有兩中方法:


1 . 用BEGIN , ROLLBACK , COMMIT 來實現

begin : 開始一個事務 , 然后執行create , update , insert等命令對數據做出操作?

rollback : 事務回滾 (相當于word中的ctrl+z撤銷)

commit : 事務確認 (提交 , 相當于word中的ctrl+s保存) ? ?


2 . 通過set來改變mysql的自動提交模式

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

MySQL(5)-mysql的事務與觸發器功能

set autocommit=1 ??開啟自動提交(必須用begin開始一個事務,用commit或rollback結束事務)來實現事務的處理 .查看auto commit值為狀態ON .
? ? ? ? ? ? ? ? ?

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


實例 : 進入數據庫中 , 使用test數據庫 , 創建一張testdb表 , 查看表中的數據 , 然后開啟事務功能 , 插入2條數據 , 提交事務 , 查看表中的數據 ; 然后開啟新事務 , 插入一條記錄 , 做回滾操作(撤銷) , 查看表中的數據

? ? ? ? ? ? ??

第一步 : 在test數據庫中創建testdb表 , 查看表中數據

MySQL(5)-mysql的事務與觸發器功能

第二步 : 開啟事務功能 , 并插入數據 ,然后提交

MySQL(5)-mysql的事務與觸發器功能

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

MySQL(5)-mysql的事務與觸發器功能




?二 . mysql觸發器功能


觸發器(trigger)是一個特殊的存儲過程,它的執行不是由程序調用,也不是手工啟動,而是由事件(event)來觸發,
?比如當對A表進行操作事件( insert,delete, update)時就會激活它執行。觸發器經常用于加強數據的完整性約束和業務規則等

用生活實例來說 : 在A處按電腦開機鍵,電腦就開機了。
? ? ? ? ? ? ? ? ? ? ? ? ?在A處按燈的開關,B處天花板上的燈就亮了。

? ? ? ? ? ? ? ? ? ? ? ? ?在A處打卡 , 通道門就開了


創建觸發器(trigger)語法 :

CREATE ?TRIGGER ?觸發器名稱 ?BEFORE|AFTER ?觸發事件

ON ?表名 FOR ?EACH ?ROW

BEIGN

? ? ? ? ?觸發器程序體 ;

END ?

? ? ? ? <觸發器名稱> 最多64個字符,它和MySQL中其他對象的命名方式一樣
? ? ? ??{ BEFORE | AFTER } 觸發器時機
? ? ? ??{ INSERT | UPDATE | DELETE } ? 觸發的事件
? ? ? ? ON <表名稱> ? 標識建立觸發器的表名,即在哪張表上建立觸發器
? ? ? ? FOR EACH ROW ? ? ? ?觸發器的執行間隔:FOR EACH ROW子句通知觸發器 每隔一行 執行一次動作,而不是對整個表執行一次
? ? ? ?<觸發器程序體> 要觸發的SQL語句:可用順序,判斷,循環等語句實現一般程序需要的邏輯功能

?? ? ? ?

實例 : 在test數據庫中創建一張stu學生表和一張統計stu表的人數的stu_total表 ?, 然后創建student表發生改變 , stu_total表就發生改變的觸發器 , 對stu表進行操作 , 然后查看stu_total因觸發器會有什么變化

第一步 :創建這兩張表 , 并查看表中的數據

MySQL(5)-mysql的事務與觸發器功能

第二步 : 創建觸發器stu_insert_trigger 和觸發器stu_delete_trigger

MySQL(5)-mysql的事務與觸發器功能

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

MySQL(5)-mysql的事務與觸發器功能

第四步 : 檢測觸發器結果

MySQL(5)-mysql的事務與觸發器功能

第五步 : 對stu表進行delete操作 , 再次驗證實驗效果

MySQL(5)-mysql的事務與觸發器功能

? ? ? ? ? ??

從實驗結果可以看到 , 當我們對stu表進行數據的增刪操作時 , 定義觸發器后 , stu_total表會根據stu表的不同操作發生不同變化 !

? ? ? ??

刪除觸發器 :??DROP TRIGGER 解發器名稱

? ? ?

注 :此例的觸發器故障bug:如果stu_total表中的初始統計數據不正確,以上定義的這個觸發器會導致stu_total表中統計的total值跟stu表中的總記錄數信息不對稱,所以這個觸發器是有問題的。正確的解法是用count函數來統計stu表中的記錄數,不應該用加1或減1這種做法。


優化過的正確觸發器:

?#?觸發器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??;



? ? ? ?

? ? ? ? ? ? ??

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

东阿县| 天峻县| 潮安县| 侯马市| 郎溪县| 嘉祥县| 南宫市| 罗平县| 普兰店市| 宜兰市| 红安县| 富锦市| 大渡口区| 临漳县| 凤台县| 阳朔县| 牙克石市| 长岭县| 江安县| 象州县| 奉节县| 揭阳市| 即墨市| 崇信县| 雷州市| 宜黄县| 喀喇沁旗| 原平市| 丘北县| 谷城县| 许昌县| 九江市| 定西市| 利津县| 商洛市| 峨眉山市| 瑞安市| 富民县| 宝清县| 六盘水市| 平潭县|