關(guān)系數(shù)據(jù)庫-知識(shí)庫整理

這幾天瓶蝴,需要針對(duì)項(xiàng)目中的數(shù)據(jù)庫處理部分進(jìn)行詳細(xì)設(shè)計(jì)毒返,于是乎,惡補(bǔ)了一下數(shù)據(jù)設(shè)計(jì)的基礎(chǔ)知識(shí)囊蓝。網(wǎng)上內(nèi)容多且雜饿悬,新手學(xué)習(xí)困難重重,不如順著解決問題的過程聚霜,依次把數(shù)據(jù)庫設(shè)計(jì)中涉及的基礎(chǔ)知識(shí)狡恬、問題及解決辦法整理成一個(gè)系列,真正的從入門到精通蝎宇。

注明:為了方便弟劲,本文所指數(shù)據(jù)庫均為關(guān)系型數(shù)據(jù)庫。

數(shù)據(jù)庫-基本概念

如果不開發(fā)姥芥,只是數(shù)據(jù)管理兔乞,那使用Excel就行,用不著數(shù)據(jù)庫凉唐;如果只是開發(fā)無需數(shù)據(jù)保存的程序庸追,那也用不上數(shù)據(jù)庫,數(shù)據(jù)保存在內(nèi)存里台囱,進(jìn)程關(guān)閉淡溯,內(nèi)存中的數(shù)據(jù)也隨之被釋放了。

所以簿训,當(dāng)開發(fā)需要對(duì)數(shù)據(jù)進(jìn)行存儲(chǔ)及管理的程序時(shí)咱娶,才會(huì)使用到數(shù)據(jù)庫(當(dāng)然,也不一定强品,使用Excel/txt/xml/json有時(shí)候也可以滿足需求膘侮,但是,這些文件未嘗不是一種另類的“數(shù)據(jù)庫”)的榛,所以琼了,數(shù)據(jù)庫,可以理解為一種數(shù)據(jù)的存儲(chǔ)和管理工具困曙。

百度百科給出的概念表伦,云里霧里谦去,簡(jiǎn)言之慷丽,數(shù)據(jù)庫管理系統(tǒng)蹦哼,一款針對(duì)數(shù)據(jù)庫的應(yīng)用程序,提供數(shù)據(jù)的增要糊、刪纲熏、改、查操作接口(命令行锄俄、可視化局劲、Helper、ADO...)奶赠,如果是程序員鱼填,而非DBA,數(shù)據(jù)庫基本概念的理解毅戈,到此OK苹丸。后續(xù),無非是對(duì)各類數(shù)據(jù)庫基本配置苇经、操作接口的熟悉和使用赘理。

數(shù)據(jù)庫-基本結(jié)構(gòu)

關(guān)系型數(shù)據(jù)庫中的數(shù)據(jù)均以二維表的形式存儲(chǔ),用戶對(duì)數(shù)據(jù)進(jìn)行操作也是基于二維表的操作扇单,例如下圖所示:

數(shù)據(jù)庫表結(jié)構(gòu)

表里面有多個(gè)列商模,每個(gè)列表示這一類數(shù)據(jù)的屬性,而黃色區(qū)域?yàn)橐恍兄├剑恳恍袑?duì)應(yīng)該類數(shù)據(jù)的一個(gè)完整數(shù)據(jù)施流,也稱為一個(gè)類的一個(gè)對(duì)象實(shí)例。和面向?qū)ο蟮母拍顚?duì)應(yīng)起來鄙信,比較好理解瞪醋。

對(duì)于這個(gè)表,通過DBMS即可進(jìn)行可以進(jìn)行增加扮碧、刪除趟章、修改、查詢等操作慎王,當(dāng)然對(duì)應(yīng)具體的數(shù)據(jù)庫管理系統(tǒng)蚓土,又有可視化界面、命令行赖淤、編程接口等等方式蜀漆。

SQL

SQL,又稱為結(jié)構(gòu)化查詢語言咱旱,也可以說是操作和訪問數(shù)據(jù)庫的標(biāo)準(zhǔn)化計(jì)算機(jī)語言(引用W3School的解釋)确丢。

我們通過SQL語言操作數(shù)據(jù)庫绷耍,有關(guān)SQL語言的學(xué)習(xí),網(wǎng)上教程一堆堆鲜侥,這里先做個(gè)引用褂始,后續(xù)說明具體問題再詳細(xì)說明。

基礎(chǔ)款:http://www.phpstudy.net/e/sql/

進(jìn)階款:http://blog.jobbole.com/55086/

數(shù)據(jù)庫-關(guān)系

如果數(shù)據(jù)庫只是保存數(shù)據(jù)描函,數(shù)據(jù)和數(shù)據(jù)之間相互獨(dú)立崎苗,那所有有關(guān)數(shù)據(jù)的處理就變的簡(jiǎn)單了,但是話又說回來舀寓,這樣的數(shù)據(jù)本身也沒有意義胆数,因?yàn)闆]有關(guān)系,就意味著沒有辦法推斷他的存在意義和實(shí)際含義互墓,對(duì)于未知的數(shù)據(jù)必尼,自然毫無意義。

既然如此篡撵,也可以反推而知判莉,任何一個(gè)實(shí)體數(shù)據(jù),既然存在酸休,就不可避免的和其他數(shù)據(jù)實(shí)體之間存在關(guān)系骂租。

拿PI君舉例:

PI君的基本屬性

PI君是個(gè)純爺們,所以咱有性別這個(gè)屬性斑司,那PI君和性別這個(gè)數(shù)據(jù)就有了關(guān)系渗饮,有點(diǎn)抽象,換個(gè)角度宿刮,PI君在一家公司上班互站,是這個(gè)公司的雇員,這個(gè)就是PI君這個(gè)數(shù)據(jù)實(shí)體和公司這個(gè)數(shù)據(jù)實(shí)體之間的關(guān)系描述僵缺。

但是胡桃,僅僅如此還不夠,得證明PI君的忠誠度磕潮,PI只是一家公司的雇員翠胰,所以,如果你認(rèn)識(shí)PI君自脯,你就可以知道PI君所在公司的具體信息了之景,因?yàn)槟阒繮I君和公司的關(guān)系嘛。

OK膏潮,再換個(gè)角度锻狗,看下圖:


公司雇員列表

公司里有小明、老王、小紅是和PI君一樣的雇員轻纪,也就是說公司可以有多個(gè)和PI君類似的雇員油额,于是,我們順其自然的擴(kuò)大這個(gè)模型刻帚,如下圖:

擴(kuò)展后的數(shù)據(jù)關(guān)系圖

OK潦嘶,數(shù)據(jù)通過關(guān)系建立成一個(gè)樹狀結(jié)構(gòu)了,雖然有些重復(fù)的部分我擂,不過總歸還可以描述衬以。

現(xiàn)在缓艳,做這樣一個(gè)假設(shè):小明和小紅是一對(duì)夫妻校摩、PI君因?yàn)榕ぷ鞅惶岚螢榻?jīng)理,而非和老王阶淘、小明及小紅一樣的雇員......諸如此類衙吩,如果我們繼續(xù)用樹來描述,或者升級(jí)為圖溪窒,數(shù)據(jù)與數(shù)據(jù)之間復(fù)雜的關(guān)系坤塞,已經(jīng)不能直觀且簡(jiǎn)單獲取了,怎么辦3喊觥摹芙?身在這個(gè)復(fù)雜的社會(huì),關(guān)系總是很復(fù)雜的嘛宛瞄!

其次浮禾,如果PI君在微軟或者Google上班(千萬別信),公司雇員上千上萬份汗,那這個(gè)圖將大的超乎想象盈电。

所以只是簡(jiǎn)單的用樹或者圖來描述數(shù)據(jù)以及數(shù)據(jù)與數(shù)據(jù)之間的關(guān)系存在很多局限,只能小眾適用杯活,不能解決大部分?jǐn)?shù)據(jù)相關(guān)的問題匆帚,So,有了關(guān)系型數(shù)據(jù)庫旁钧,有了二維表結(jié)構(gòu)吸重,有了E-R模型~

E-R模型

解決通用性的不二法門就是抽象,這是PI君自己琢磨出來的歪今,基于面向?qū)ο蟮乃季S方式嚎幸,針對(duì)關(guān)系數(shù)據(jù)庫的設(shè)計(jì)也是如此。

PI君彤委,小明鞭铆,老王和小紅都是人,又都是公司雇員,所以他們其實(shí)是"公司雇員"這個(gè)抽象的實(shí)例车遂。OK封断!原理不難理解,那有沒有通用的分析模式呢舶担?當(dāng)然有坡疼,就是ER實(shí)體關(guān)系模型。

其中衣陶,實(shí)體就是PI君柄瑰、小明、老王剪况、小紅教沾、公司之類,關(guān)系就是PI君译断、小明授翻、老王、小紅都是公司的雇員孙咪,行話來說就是公司:雇員 = 1:N堪唐。于此類似,還有1對(duì)1翎蹈、多對(duì)多的關(guān)系淮菠。

球員-教練-球隊(duì)的ER模型

對(duì)于這些模型以及模型之間關(guān)系的抽象和描述,E-R模型給出了很棒的分析方法荤堪,E-R概念很好理解合陵,直接百度百科或者維基百科就好:

http://www.cnblogs.com/samwu/archive/2011/09/07/2169842.html

數(shù)據(jù)庫表

數(shù)據(jù)庫表是數(shù)據(jù)庫數(shù)據(jù)管理的基本單元,換句話說逞力,關(guān)系數(shù)據(jù)庫中的數(shù)據(jù)都是以二維表的形式存儲(chǔ)的曙寡。這個(gè)表可以理解為C#里的純數(shù)據(jù)類(沒有方法)。例如本篇一開始的那張圖寇荧,就是一個(gè)數(shù)據(jù)庫表举庶。

表的主鍵(Prime Key)

如果PI君的媳婦兒來公司找PI君,到了前臺(tái)揩抡,假如她這么問:“我要找一個(gè)男人户侥,他身高**米,體重**kg峦嗤,年紀(jì)**歲蕊唐,是你們公司的雇員,他叫PI烁设√胬妫”钓试,前臺(tái)妹妹很郁悶,她跑遍整個(gè)公司大樓副瀑,挨個(gè)部門敲門或者打電話的找弓熏,最后竟然找到15個(gè)和PI君媳婦描述符合的人,好吧糠睡,這下子麻煩大了……

如果不是PI君媳婦認(rèn)出了PI君獨(dú)一無二的鞋拔子臉挽鞠,估計(jì)這次就空跑一趟了…

但是,假如還有一個(gè)符合描述且和PI一樣的鞋拔子臉呢狈孔?

又或者信认,PI君媳婦這次時(shí)間緊張,一分鐘以后見不到PI君就離婚~~~~咋辦熬椤嫁赏?!

前臺(tái)妹妹說:“你把PI君的電話或工號(hào)告訴我嘛到忽,這樣就可以直接電話他或定位他的部門啦~”O(jiān)K橄教,故事講到這里,有關(guān)數(shù)據(jù)庫表的主鍵就很好理解啦喘漏,主鍵是數(shù)據(jù)庫表中每一個(gè)實(shí)例的唯一標(biāo)識(shí),有了一個(gè)唯一標(biāo)識(shí)华烟,可以極快的找到對(duì)應(yīng)的實(shí)例翩迈,而且是唯一的實(shí)例。

那換個(gè)角度問一句盔夜,每個(gè)表都必須有主鍵嗎负饲?當(dāng)然不用,至于為什么喂链,見仁見智啦返十,請(qǐng)看官們自己思考下~

另一個(gè)問題,主鍵最多只有一個(gè)椭微?Yes洞坑,主鍵只能有一個(gè),如果想給一個(gè)表提供更精準(zhǔn)的查詢索引蝇率,OK迟杂,可以設(shè)置一個(gè)表的多列為索引,索引不是主鍵本慕,注意二者的區(qū)別排拷。

表的外鍵(Foreign Key)

除了主鍵,還有另外一個(gè)概念:外鍵锅尘。

同樣以公司和雇員為例监氢,PI君 ,小明,老王和小紅都是公司的雇員浪腐,但是何鸡,PI君和小明是Google公司的,老王和小紅是微軟公司的牛欢,現(xiàn)在有兩個(gè)表來描述這些數(shù)據(jù)實(shí)體骡男,如下圖:

Employee
Company

注:兩個(gè)表中的RecNo分別是各自表的主鍵。

沒有外鍵的情況下傍睹,如上圖所示的描述看似OK隔盛,不過假如此時(shí),Google公司把微軟收購了拾稳,現(xiàn)在Company表中只有一個(gè)數(shù)據(jù)實(shí)例吮炕,也就是Google,微軟被刪除了访得,微軟得通知原微軟雇員老王和小紅更改自己的CompanyID龙亲,可是,Company中已經(jīng)沒有了微軟這個(gè)數(shù)據(jù)實(shí)例悍抑,現(xiàn)有的Google也不知道自己有哪些雇員鳄炉,于是,老王和小紅的CompanyID成了不存在的數(shù)據(jù)搜骡,二人百口莫辯拂盯,身份可疑~

分析下微軟被Google收購的過程,單獨(dú)描述记靡,Google收購微軟谈竿,很簡(jiǎn)單,在Company表中刪除微軟即可摸吠,但是”老王/小紅是微軟的雇員“這兩個(gè)關(guān)系的描述卻沒有被處理空凸,甚至沒有被有效的描述,通過老王/小紅知道二位是微軟雇員寸痢,但是通過微軟呀洲,并不知道有老王/小紅這兩個(gè)雇員筒占,所以在微軟被收購以后仓手,就沒法去處理原本應(yīng)該與之關(guān)聯(lián)的雇員們。

所以届慈,為了保持?jǐn)?shù)據(jù)的一致性和完整性族壳,數(shù)據(jù)庫中除了對(duì)數(shù)據(jù)進(jìn)行描述憔辫,同時(shí)還要描述關(guān)系,關(guān)系的描述/區(qū)分/識(shí)別仿荆,使用的就是外鍵贰您。

外鍵坏平,全稱為外關(guān)鍵字(Foreign Key)

如果公共關(guān)鍵字在一個(gè)關(guān)系中是主關(guān)鍵字,那么這個(gè)公共關(guān)鍵字被稱為另一個(gè)關(guān)系的外關(guān)鍵字锦亦。由此可見舶替,外關(guān)鍵字表示了兩個(gè)關(guān)系之間的聯(lián)系。以另一個(gè)關(guān)系的外關(guān)鍵字作主關(guān)鍵字(主鍵)的表被稱為主表杠园,具有此外關(guān)鍵字的表被稱為主表的從表顾瞪。外關(guān)鍵字又稱作外鍵。

繼續(xù)舉例說明:Company-Employee存在一種雇傭關(guān)系抛蚁,及一個(gè)雇員必然屬于某一個(gè)公司陈醒,一個(gè)公司必然包含不少于一個(gè)雇員,所以Employ中的CompanyID就是這段關(guān)系的主鍵瞧甩,是Emloyee表的外鍵钉跷,對(duì)應(yīng)于Company表的ID屬性,所以這段關(guān)系中Company是主表肚逸,而Employee是從表爷辙。

概念上理解以后,保持?jǐn)?shù)據(jù)完整性的措施就很好理解了朦促,如果微軟被收購膝晾,首先必須根據(jù)雇傭關(guān)系找到他的雇員,要么解雇思灰,然后被谷歌收購玷犹,要么不允許被收購,至于實(shí)現(xiàn)方式是多樣的洒疚,順勢(shì)說下數(shù)據(jù)庫完整性的概念。

數(shù)據(jù)庫完整性

數(shù)據(jù)庫完整性坯屿,也就是數(shù)據(jù)完整性油湖,包含多個(gè)角度的概念(網(wǎng)上又不少對(duì)這個(gè)東西的說明,但是真正理解透徹的领跛,說的一般人能明白的不多乏德,以下內(nèi)容結(jié)合了網(wǎng)上學(xué)習(xí)的內(nèi)容和PI君自己的理解,旨在深刻理解概念吠昭,明白設(shè)計(jì)的理由喊括,從而在實(shí)際的數(shù)據(jù)庫設(shè)計(jì)工作中不人云亦云,有自己的見解矢棚。)

實(shí)體完整性(Entity Integrity)郑什、域完整性(Domain Integrity)、參照完整性(Referential Integrity)蒲肋、用戶定義的完整性(User-definedIntegrity)

實(shí)體完整性:實(shí)體完整性要求每一個(gè)表中的主鍵字段都不能為空或者重復(fù)的值蘑拯;

域完整:域完整性指列的值域的完整性钝满,如數(shù)據(jù)類型、格式申窘、值域范圍弯蚜、是否允許空值等,域完整性限制了某些屬性中出現(xiàn)的值剃法,把屬性限制在一個(gè)有限的集合中碎捺。例如,如果屬性類型是整數(shù)贷洲,那么它就不能是101.5或任何非整數(shù)收厨。

參照完整性:當(dāng)更新、刪除恩脂、插入一個(gè)表中的數(shù)據(jù)時(shí)帽氓,通過參照引用相互關(guān)聯(lián)的另一個(gè)表中的數(shù)據(jù),來檢查對(duì)表的數(shù)據(jù)操作是否正確俩块。參照的完整性要求關(guān)系中不允許引用不存在的實(shí)體黎休。

→→→如果在學(xué)生表和選修課之間用學(xué)號(hào)建立關(guān)聯(lián),學(xué)生表是主表玉凯,選修課是從表势腮,那么,在向從表中輸入一條新記錄時(shí)漫仆,系統(tǒng)要檢查新記錄的學(xué)號(hào)是否在主表中已存在捎拯,如果存在,則允許執(zhí)行輸入操作盲厌,否則拒絕輸入署照,這就是參照完整性。

→→→參照完整性還體現(xiàn)在對(duì)主表中的刪除和更新操作吗浩,例如建芙,如果刪除主表中的一條記錄,則從表中凡是外鍵的值與主表的主鍵值相同的記錄也會(huì)被同時(shí)刪除懂扼,將此稱為級(jí)聯(lián)刪除禁荸;如果修改主表中主關(guān)鍵字的值,則從表中相應(yīng)記錄的外鍵值也隨之被修改阀湿,將此稱為級(jí)聯(lián)更新赶熟。

用戶定義的完整性:可以理解為域完整性。

:完整性概念的理解參考:http://blog.csdn.net/zm_21/article/details/8101974

保持?jǐn)?shù)據(jù)完整性陷嘴,需要用到SQL語句中的規(guī)則/約束/級(jí)聯(lián)更新/級(jí)聯(lián)刪除(并不是所有數(shù)據(jù)庫軟件提供商都支持映砖,開發(fā)人員需特別注意),接下來依次給出例子來說明罩旋,例子使用的是MySQL啊央,其他版本的數(shù)據(jù)庫在描述時(shí)或有不同眶诈,注意甄別:

規(guī)則(Rule):

create rule _employee_sex_rule_ as @Sex in ('男','女') ?//創(chuàng)建規(guī)則,Sex屬性只能取值“男”或“女”

exec sp_helptext _employee_sex_rule_ //使用存儲(chǔ)過程sp_helptext查看“_employee_sex_rule_”規(guī)則

exec sp_bindrule _employee_sex_rule_, 'Employee.[Sex] '//使用存儲(chǔ)過程sp_bindrule綁定規(guī)則至Employee表的Sex列

exec sp_unbindrule _employee_sex_rule_, 'Employee.[Sex] '//使用存儲(chǔ)過程sp_unbindrule接觸綁定規(guī)則至Employee表的Sex列

drop rule _employee_sex_rule_ //刪除規(guī)則

約束(Check):

creat table Employee(ID int NOT NULL,Sex varchar(255) NOT NULL,Name varchar(255) NOT NULL,CompanyID foreignkey(ID) referencesUserInfo(ID), check(Sex in ('男','女'))) //創(chuàng)建表時(shí)定義約束

ALTER TABLE Employee add check(Sex in ('男','女') //對(duì)已有表添加約束

級(jí)聯(lián)刪除/級(jí)聯(lián)更新:

creat table Employee(ID int NOT NULL,Sex varchar(255) NOT NULL,Name varchar(255) NOT NULL,CompanyID foreignkey(ID) referencesUserInfo(ID) on delete cascade /on update cascade

數(shù)據(jù)庫一致性

數(shù)據(jù)庫一致性瓜饥,也就是數(shù)據(jù)一致性逝撬,對(duì)于關(guān)系數(shù)據(jù)庫而言,可以這么理解:以Employee數(shù)據(jù)表為例乓土,有一天PI君老媽通過算命先生宪潮,覺得PI君這個(gè)名字起的不好,找到PI君以后趣苏,就帶著PI君去派出所給PI君改名為PIPI君狡相,同時(shí),PI君媳婦正在保險(xiǎn)公司給PI君買保險(xiǎn)食磕,因?yàn)镮T行業(yè)風(fēng)險(xiǎn)高嘛尽棕,動(dòng)不動(dòng)加班猝死之類的,在填寫擔(dān)保人時(shí)彬伦,用的是“PI君”這個(gè)名字滔悉,畢竟PI君老媽給PI君改名的時(shí)候,PI君媳婦是不知情的单绑。果然有一天回官,PI君真的悲劇了,保險(xiǎn)公司核對(duì)保單發(fā)現(xiàn)搂橙,沒有PI君這個(gè)人歉提,只有PIPI君,好嘛区转,麻煩大了......

所以苔巨,怎么保證PI君的個(gè)人信息在被任何用戶獲取或使用時(shí),始終都只有一個(gè)版本呢废离?這個(gè)問題就是數(shù)據(jù)庫一致性需要研究的問題恋拷。

保證數(shù)據(jù)一致性的措施主要是事務(wù)機(jī)制,以及對(duì)數(shù)據(jù)訪問的并發(fā)控制厅缺,看下文↓↓↓↓↓

并發(fā)控制

并發(fā)控制宴偿,其實(shí)就是在多個(gè)用戶同時(shí)或者重疊時(shí)段內(nèi)訪問同一數(shù)據(jù)資源時(shí)(比如PI君)湘捎,對(duì)訪問的過程進(jìn)行控制,防止出現(xiàn)違反數(shù)據(jù)一致性要求的行為窄刘。

擴(kuò)展下窥妇,有哪些違反數(shù)據(jù)一致性的情況呢?

① 丟失修改娩践,簡(jiǎn)單說PI君老媽給PI君改名為PIPI君活翩,PI君媳婦不知道烹骨,在給PI君買保險(xiǎn)的時(shí)候,特指PI君的名字對(duì)應(yīng)PI君的身份證材泄,并給派出所去電沮焕,確認(rèn)PI君就是身份證上的PI君,派出所說一個(gè)身份證只能有一個(gè)名字拉宗,結(jié)果PI君的新名字PIPI君直接失效峦树;

② 數(shù)據(jù)不能重現(xiàn),繼續(xù)拿PI君的例子說事兒旦事,PI君老媽給PI君改名為PIPI君魁巩,PI君媳婦兒給PI君買保險(xiǎn),投保的時(shí)候姓名是“PI君”姐浮,PI悲劇那天兌保的時(shí)候卻查不到“PI君”這個(gè)姓名谷遂;

③ 臟數(shù)據(jù),PI君老媽給PI君改名為PIPI君卖鲤,并通過聯(lián)網(wǎng)發(fā)布該信息肾扰,PI君媳婦兒給PI君買保險(xiǎn),投保的時(shí)候姓名是“PIPI君”扫尖,但是那天派出所數(shù)據(jù)庫被黑客黑掉白对,當(dāng)天更新數(shù)據(jù)丟失,只能恢復(fù)至前一天换怖,所以PIPI君又恢復(fù)姓名為“PI君”甩恼,于是投保的那個(gè)“PIPI君”就成了不存在的人,也就是臟數(shù)據(jù)沉颂。

并發(fā)控制的實(shí)現(xiàn)方式有多種条摸,主流的就是封鎖和時(shí)間戳,封鎖機(jī)制類似于多線程問題的處理(都是共享資源的訪問控制)铸屉,也是最常用的并發(fā)控制技術(shù)钉蒲,這里進(jìn)行簡(jiǎn)單的介紹:

在多線程開發(fā)的時(shí)候,如果想訪問一個(gè)共享資源彻坛,擔(dān)心出現(xiàn)并發(fā)訪問異常顷啼,一般先Lock該資源,處理完成后再UnLock昌屉,對(duì)于數(shù)據(jù)庫钙蒙,道理是一樣的,不過針對(duì)數(shù)據(jù)的特性间驮,又分為兩類鎖:讀鎖和寫鎖躬厌,又因?yàn)樽x的時(shí)候大家都可以讀,只要不修改數(shù)據(jù)竞帽,并不影響數(shù)據(jù)一致性扛施,所以讀鎖也叫共享鎖(其實(shí)鸿捧,專業(yè)的講,先有共享鎖ShareLocks疙渣,簡(jiǎn)稱S鎖)匙奴;但是寫的時(shí)候,其他人就不能再讀了或者寫了昌阿,不然就會(huì)有數(shù)據(jù)不一致的情況發(fā)生饥脑,所以這個(gè)鎖也叫排他鎖,也就是Exclusive Locks懦冰,簡(jiǎn)稱X鎖灶轰。

并發(fā)控制的時(shí)候,任何用戶想訪問數(shù)據(jù)資源刷钢,先加鎖笋颤,加鎖成功以后才能訪問,加鎖怎么著才能成功就是訪問控制的邏輯内地,也就是常說的DBMS封鎖協(xié)議伴澄,PI君做了簡(jiǎn)單的歸納:

① 如果一個(gè)用戶想訪問一個(gè)數(shù)據(jù)資源,首先必須給該資源加鎖阱缓,加鎖成功后才能對(duì)該資源進(jìn)行訪問非凌,加S鎖,只能讀取該資源荆针,加X鎖則可以讀和修改敞嗡;

② 如果一個(gè)數(shù)據(jù)資源被加了X鎖,那么除了加鎖的用戶具備對(duì)該數(shù)據(jù)資源的訪問及操作權(quán)限航背,其他用戶再給該資源加鎖(X或S鎖)喉悴,都只能等待,直至該資源被解鎖玖媚;

③ 如果一個(gè)數(shù)據(jù)資源被加了S鎖箕肃,那么加鎖用戶可以訪問該資源,但是不能修改今魔,其他用戶可以給該資源加S鎖勺像,但是添加X鎖則只能等待,直至該資源上的所有S鎖均被解除错森。

當(dāng)然咏删,在實(shí)際的數(shù)據(jù)庫版本中,并不完全遵照這個(gè)協(xié)議问词,比如MySQL,采用多版本的并發(fā)控制嘀粱,讀取數(shù)據(jù)的時(shí)候是不加鎖的激挪,因?yàn)樽x的是歷史版本辰狡,不存在修改和刪除,所以保障了效率的同時(shí)還保障了數(shù)據(jù)的一致性垄分,這里不展開宛篇,有興趣的可以讀讀云創(chuàng)大數(shù)據(jù)的這篇技術(shù)博文:

http://www.cstor.cn/textdetail_7953.html

并發(fā)控制,繼續(xù)展開的內(nèi)容包括死鎖薄湿、活鎖叫倍、死鎖解除、并行調(diào)度豺瘤、串行調(diào)度吆倦,但是,對(duì)于普通程序員坐求,而非DBA蚕泽,了解自此,也算OK桥嗤,所以在本篇博文须妻,不再展開,后續(xù)PI君會(huì)單獨(dú)針對(duì)并發(fā)控制整理一篇博文泛领,敬請(qǐng)期待吧~

事務(wù)

對(duì)于事務(wù)的理解可以參考程序語言中的函數(shù)概念荒吏,是一個(gè)工作單元。舉個(gè)例子渊鞋,還是公司和雇員的例子绰更,假如因?yàn)轫?xiàng)目需要,Google和微軟商量進(jìn)行技術(shù)人員的互換篓像,很不幸动知,Google的PI君和微軟的老王成了互換的對(duì)象,首先员辩,Employee表中PI君的CompanyID更改為微軟的ID盒粮,下一步,老王的CompanyID更改的Google的ID奠滑,完成后這個(gè)互換工作結(jié)束丹皱。

但是,假設(shè)在PI君換至微軟以后宋税,微軟忽然改主意了摊崭,不打算把老王換回來了,咋辦呢杰赛?通常而言呢簸,如果互換工作不能進(jìn)行,應(yīng)該將數(shù)據(jù)恢復(fù)至互換之前的狀態(tài),提供這種機(jī)制或功能的東東就是事務(wù)根时。

所謂事務(wù)瘦赫,就是用戶自定義的一個(gè)數(shù)據(jù)庫操作序列,這些操作要么全做蛤迎,要么全不做确虱,是一個(gè)不可分割的工作單元,在關(guān)系數(shù)據(jù)庫中替裆,事務(wù)可以是一條Sql語句校辩、一組Sql語句或整個(gè)程序。

在實(shí)際應(yīng)用中辆童,可以通過ADO提供的Connection和Transaction對(duì)象來進(jìn)行事務(wù)的控制宜咒,具體參看:

http://www.cnblogs.com/chinafine/archive/2010/02/27/1674759.html

存儲(chǔ)過程

觸發(fā)器

關(guān)聯(lián)查詢

ADO

ORM

未完待續(xù)~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市胸遇,隨后出現(xiàn)的幾起案子荧呐,更是在濱河造成了極大的恐慌,老刑警劉巖纸镊,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件倍阐,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡逗威,警方通過查閱死者的電腦和手機(jī)峰搪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凯旭,“玉大人概耻,你說我怎么就攤上這事」藓簦” “怎么了鞠柄?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)嫉柴。 經(jīng)常有香客問我厌杜,道長(zhǎng),這世上最難降的妖魔是什么计螺? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任夯尽,我火速辦了婚禮,結(jié)果婚禮上登馒,老公的妹妹穿的比我還像新娘匙握。我一直安慰自己,他們只是感情好陈轿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布圈纺。 她就那樣靜靜地躺著秦忿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪赠堵。 梳的紋絲不亂的頭發(fā)上小渊,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音茫叭,去河邊找鬼。 笑死半等,一個(gè)胖子當(dāng)著我的面吹牛揍愁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播杀饵,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼莽囤,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了切距?” 一聲冷哼從身側(cè)響起朽缎,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谜悟,沒想到半個(gè)月后话肖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡葡幸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年最筒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蔚叨。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡床蜘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蔑水,到底是詐尸還是另有隱情邢锯,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布搀别,位于F島的核電站丹擎,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏领曼。R本人自食惡果不足惜鸥鹉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望庶骄。 院中可真熱鬧毁渗,春花似錦、人聲如沸单刁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至肺樟,卻和暖如春檐春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背么伯。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來泰國打工疟暖, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人田柔。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓俐巴,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親硬爆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子欣舵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容