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