摘要:生成訂單并且保存到數(shù)據(jù)庫中。觸發(fā)器是在響應(yīng)數(shù)據(jù)定義語言事件時執(zhí)行的存儲過程。利用觸發(fā)器記錄所進行的修改以及相關(guān)信息,跟蹤用戶對數(shù)據(jù)庫的操作,實現(xiàn)審計。預(yù)告本周三將更新面試數(shù)據(jù)庫的索引,敬請期待。
你好,是我琉憶,PHP程序員面試筆試系列圖書的作者。
本周(2019.3.4至3.8)的一三五更新的文章如下:
周一:PHP面試MySQL數(shù)據(jù)庫的基礎(chǔ)知識
周三:PHP面試MySQL數(shù)據(jù)庫的索引
周五:PHP面試MySQL數(shù)據(jù)庫的面試真題
自己整理了一篇“一二三四范式有何區(qū)別?”的文章,關(guān)注公眾號:“琉憶編程庫”,回復(fù):“范式”,我發(fā)給你。
以下內(nèi)容來自《PHP程序員面試筆試寶典》如需轉(zhuǎn)載請注明出處。
SQL是結(jié)構(gòu)化查詢語言(Structured Query Language)的縮寫,其功能包括數(shù)據(jù)查詢、數(shù)據(jù)操縱、數(shù)據(jù)定義和數(shù)據(jù)控制四個部分。
數(shù)據(jù)查詢是數(shù)據(jù)庫中最常見的操作,通過select語句可以得到所需的信息。SQL語言的數(shù)據(jù)操縱語句(Data Manipulation Language,DML)主要包括插入數(shù)據(jù)、修改數(shù)據(jù)以及刪除數(shù)據(jù)三種語句。SQL語言使用數(shù)據(jù)定義語言(Data Definition Language,DDL)實現(xiàn)數(shù)據(jù)定義功能,可對數(shù)據(jù)庫用戶、基本表、視圖、索引進行定義與撤銷。數(shù)據(jù)控制語句(Data Control Language,DCL)用于對數(shù)據(jù)庫進行統(tǒng)一的控制管理,保證數(shù)據(jù)在多用戶共享的情況下能夠安全。
基本的SQL語句有select、insert、update、delete、create、drop、grant、revoke等。其具體使用方式見下表。
自己整理了一篇“一二三四范式有何區(qū)別?”的文章,關(guān)注公眾號:“琉憶編程庫”,回復(fù):“范式”,我發(fā)給你。
事務(wù)是數(shù)據(jù)庫中一個多帶帶的執(zhí)行單元(Unit),它通常由高級數(shù)據(jù)庫操作語言(例如SQL)或編程語言(例如C++、Java等)書寫的用戶程序的執(zhí)行所引起。當(dāng)在數(shù)據(jù)庫中更改數(shù)據(jù)成功時,在事務(wù)中更改的數(shù)據(jù)便會提交,不再改變;否則,事務(wù)就取消或者回滾,更改無效。
例如網(wǎng)上購物,其交易過程至少包括以下幾個步驟的操作:
1)更新客戶所購商品的庫存信息。
2)保存客戶付款信息。
3)生成訂單并且保存到數(shù)據(jù)庫中。
4)更新用戶相關(guān)信息,如購物數(shù)量等。
在正常的情況下,這些操作都將順利進行,最終交易成功,與交易相關(guān)的所有數(shù)據(jù)庫信息也成功地更新。但是,如果遇到突然掉電或是其他意外情況,導(dǎo)致這一系列過程中任何一個環(huán)節(jié)出了差錯,例如在更新商品庫存信息時發(fā)生異常、顧客銀行賬戶余額不足等,都將導(dǎo)致整個交易過程失敗。而一旦交易失敗,數(shù)據(jù)庫中所有信息都必須保持交易前的狀態(tài)不變,例如最后一步更新用戶信息時失敗而導(dǎo)致交易失敗,那么必須保證這筆失敗的交易不影響數(shù)據(jù)庫的狀態(tài),即原有的庫存信息沒有被更新、用戶也沒有付款、訂單也沒有生成。否則,數(shù)據(jù)庫的信息將會不一致,或者出現(xiàn)更為嚴(yán)重的不可預(yù)測的后果,數(shù)據(jù)庫事務(wù)正是用來保證這種情況下交易的平穩(wěn)性和可預(yù)測性的技術(shù)。
事務(wù)必須滿足四個屬性,即原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability),即ACID四種屬性。
(1)原子性
事務(wù)是一個不可分割的整體,為了保證事務(wù)的總體目標(biāo),事務(wù)必須具有原子性,即當(dāng)數(shù)據(jù)修改時,要么全執(zhí)行,要么全都不執(zhí)行,即不允許事務(wù)部分地完成,避免了只執(zhí)行這些操作的一部分而帶來的錯誤。原子性要求事務(wù)必須被完整執(zhí)行。
(2)一致性
一個事務(wù)執(zhí)行之前和執(zhí)行之后數(shù)據(jù)庫數(shù)據(jù)必須保持一致性狀態(tài)。數(shù)據(jù)庫的一致性狀態(tài)應(yīng)該滿足模式鎖指定的約束,那么在完整執(zhí)行該事務(wù)后數(shù)據(jù)庫仍然處于一致性狀態(tài)。為了維護所有數(shù)據(jù)的完整性,在關(guān)系型數(shù)據(jù)庫中,所有的規(guī)則必須應(yīng)用到事務(wù)的修改上。數(shù)據(jù)庫的一致性狀態(tài)由用戶來負(fù)責(zé),由并發(fā)控制機制實現(xiàn),例如銀行轉(zhuǎn)賬,轉(zhuǎn)賬前后兩個賬戶金額之和應(yīng)保持不變,由于并發(fā)操作帶來的數(shù)據(jù)不一致性包括丟失數(shù)據(jù)修改、讀“臟”數(shù)據(jù)、不可重復(fù)讀和產(chǎn)生幽靈數(shù)據(jù)。
(3)隔離性
隔離性也被稱為獨立性,當(dāng)兩個或多個事務(wù)并發(fā)執(zhí)行時,為了保證數(shù)據(jù)的安全性,將一個事物內(nèi)部的操作與事務(wù)的操作隔離起來,不被其他正在進行的事務(wù)看到。例如對任何一對事務(wù)T1、T2,對T1而言,T2要么在T1開始之前已經(jīng)結(jié)束,要么在T1完成之后再開始執(zhí)行。數(shù)據(jù)庫有四種類型的事務(wù)隔離級別:不提交的讀、提交的讀、可重復(fù)的讀和串行化。因為隔離性使得每個事務(wù)的更新在它被提交之前,對其他事務(wù)都是不可見的,所以,實施隔離性是解決臨時更新與消除級聯(lián)回滾問題的一種方式。
(4)持久性
持久性也被稱為永久性,事務(wù)完成以后,數(shù)據(jù)庫管理系統(tǒng)(DBMS)保證它對數(shù)據(jù)庫中的數(shù)據(jù)的修改是永久性的,當(dāng)系統(tǒng)或介質(zhì)發(fā)生故障時,該修改也永久保持。持久性一般通過數(shù)據(jù)庫備份與恢復(fù)來保證。
嚴(yán)格來說,數(shù)據(jù)庫事務(wù)屬性(ACID)都是由數(shù)據(jù)庫管理系統(tǒng)來進行保證的,在整個應(yīng)用程序運行過程中應(yīng)用無須去考慮數(shù)據(jù)庫的ACID實現(xiàn)。
一般情況下,通過執(zhí)行COMMIT或ROLLBACK語句來終止事務(wù),當(dāng)執(zhí)行COMMIT語句時,自從事務(wù)啟動以來對數(shù)據(jù)庫所做的一切更改就成為永久性的了,即被寫入磁盤,而當(dāng)執(zhí)行ROLLBACK語句時,自動事務(wù)啟動以來對數(shù)據(jù)庫所做的一切更改都會被撤銷,并且數(shù)據(jù)庫中內(nèi)容返回到事務(wù)開始之前所處的狀態(tài)。無論什么情況,在事務(wù)完成時,都能保證回到一致狀態(tài)。
觸發(fā)器是一種特殊類型的存儲過程,它由事件觸發(fā),而不是程序調(diào)用或手工啟動,當(dāng)數(shù)據(jù)庫有特殊的操作時,對這些操作由數(shù)據(jù)庫中的事件來觸發(fā),自動完成這些SQL語句。使用觸發(fā)器可以用來保證數(shù)據(jù)的有效性和完整性,完成比約束更復(fù)雜的數(shù)據(jù)約束。
具體而言,觸發(fā)器與存儲過程的區(qū)別見下表。
根據(jù)SQL語句的不同,觸發(fā)器可分為兩類:DML觸發(fā)器和DLL觸發(fā)器。
DML觸發(fā)器是當(dāng)數(shù)據(jù)庫服務(wù)器發(fā)生數(shù)據(jù)操作語言事件時執(zhí)行的存儲過程,有After和Instead Of這兩種觸發(fā)器。After觸發(fā)器被激活觸發(fā)是在記錄改變之后進行的一種觸發(fā)器。Instead Of觸發(fā)器是在記錄變更之前,去執(zhí)行觸發(fā)器本身所定義的操作,而不是執(zhí)行原來SQL語句里的操作。DLL觸發(fā)器是在響應(yīng)數(shù)據(jù)定義語言事件時執(zhí)行的存儲過程。
具體而言,觸發(fā)器的主要作用表現(xiàn)為如下幾個方面:
1)增加安全性。
2)利用觸發(fā)器記錄所進行的修改以及相關(guān)信息,跟蹤用戶對數(shù)據(jù)庫的操作,實現(xiàn)審計。
3)維護那些通過創(chuàng)建表時的聲明約束不可能實現(xiàn)的復(fù)雜的完整性約束以及對數(shù)據(jù)庫中特定事件進行監(jiān)控與響應(yīng)。
4)實現(xiàn)復(fù)雜的非標(biāo)準(zhǔn)的數(shù)據(jù)庫相關(guān)完整性規(guī)則、同步實時地復(fù)制表中的數(shù)據(jù)。
5)觸發(fā)器是自動的,它們在對表的數(shù)據(jù)做了任何修改之后就會被激活,例如可以自動計算數(shù)據(jù)值,如果數(shù)據(jù)的值達到了一定的要求,則進行特定的處理。以某企業(yè)財務(wù)管理為例,如果企業(yè)的資金鏈出現(xiàn)短缺,并且達到某種程度,則發(fā)送警告信息。
下面是一個觸發(fā)器的例子,該觸發(fā)器的功能是在每周末進行數(shù)據(jù)表更新,如果當(dāng)前用戶沒有訪問WEEKEND_UPDATE_OK表的權(quán)限,那么需要重新賦予權(quán)限。
CREATE OR REPLACE TRIGGER update_on_weekends_check BEFORE UPDATE OF sal ON EMP FOR EACH ROW DECLARE my_count number(4); BEGIN SELECT COUNT(u_name) FROM WEEKEND_UPDATE_OK INTO my_count WHERE u_name = user_name; IF my_count=0 THEN RAISE_APPLICATION_ERROR(20508, "Update not allowed"); END IF; END;
事前觸發(fā)發(fā)生在事件發(fā)生之前驗證一些條件或進行一些準(zhǔn)備工作;事后觸發(fā)發(fā)生在事件發(fā)生之后,做收尾工作,保證事務(wù)的完整性。而事前觸發(fā)可以獲得之前和新的字段值。語句級觸發(fā)器可以在語句執(zhí)行之前或之后執(zhí)行,而行級觸發(fā)在觸發(fā)器所影響的每一行觸發(fā)一次。
預(yù)告:本周三(3.6)將更新PHP面試MySQL數(shù)據(jù)庫的索引,敬請期待。
以上內(nèi)容摘自《PHP程序員面試筆試寶典》書籍,目前本書沒有電子版,可到各大電商平臺購買紙質(zhì)版。
更多PHP相關(guān)的面試知識、考題可以關(guān)注公眾號獲取:琉憶編程庫
對本文有什么問題或建議都可以進行留言,我將不斷完善追求極致,感謝你們的支持。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/30933.html
摘要:而在面試過程中,也是經(jīng)常會遇到的,所以,無論是面試準(zhǔn)備還是日常開發(fā),我們都應(yīng)該關(guān)注這方面的東西。二分法的基本做法是確定要查找的區(qū)間。區(qū)間內(nèi)選取二分點。根據(jù)二分點的值,綜合左右區(qū)間情況以及求解的目的,舍去一半無用的區(qū)間。 showImg(https://images.pexels.com/photos/935977/pexels-photo-935977.jpeg); 前言 面試是你進入...
摘要:個人也建議不要滿足于自己當(dāng)下所知道的,多去拓展自己,多去學(xué)新的東西。作為一個面試者來說,知識點的記憶準(zhǔn)備為的是更好的應(yīng)對面試中技術(shù)面中問到的各種問題。 你好,是我琉憶——PHP程序員面試筆試系列圖書的作者。 隨著越來越多的人開始邁入PHP開發(fā)工程師的隊列,不管是一個PHP新手還是一個有一兩年開發(fā)經(jīng)驗的PHPer都不得不去面對找工作前面試這件事。 我現(xiàn)在以個人對面試的經(jīng)歷和見解來全面的對...
摘要:雖然有了十全的計劃,但如何高效率去記住上面那么多東西是一個大問題,看看我是怎么做的。 前言 前一篇文章講述了我在三月份毫無準(zhǔn)備就去面試的后果,一開始心態(tài)真的爆炸,但是又不服氣,一想到每次回來后家人朋友問我面試結(jié)果的期待臉,越覺得必須付出的行動來證明自己了。 面經(jīng)傳送門:一個1年工作經(jīng)驗的PHP程序員是如何被面試官虐的? 下面是我花費兩個星期做的準(zhǔn)備,主要分三部分: 有計劃——計劃好...
摘要:正確做法是給加索引,還有聯(lián)合索引,并不能避免全表掃描。 前言:有收獲的話請加顆小星星,沒有收獲的話可以 反對 沒有幫助 舉報三連 有心的同學(xué)應(yīng)該會看到我這個noteBook下面的其它知識,希望對你們有些許幫助。 本文地址 時間點:2017-11 一個16年畢業(yè)生所經(jīng)歷的php面試 一、什么是面試 二、面試準(zhǔn)備 1. 問:什么時候開始準(zhǔn)備? 2. 問:怎么準(zhǔn)備? 三、面試...
閱讀 2138·2021-09-06 15:02
閱讀 1753·2021-08-13 15:02
閱讀 2319·2019-08-29 14:14
閱讀 1478·2019-08-26 13:55
閱讀 560·2019-08-26 13:46
閱讀 3415·2019-08-26 11:41
閱讀 533·2019-08-26 10:27
閱讀 3279·2019-08-23 15:28