索引有哪些,用性別做聯(lián)合索引有沒(méi)有效果
MySQL官方對(duì)索引的定義為:索引(Index)是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)癞谒。
普通索引弹砚、唯一索引桌吃、主鍵索引逗物、全文索引
1.索引加快數(shù)據(jù)庫(kù)的檢索速度
2.索引降低了插入敬察、刪除莲祸、修改等維護(hù)任務(wù)的速度
3.唯一索引可以確保每一行數(shù)據(jù)的唯一性
4.通過(guò)使用索引锐帜,可以在查詢的過(guò)程中使用優(yōu)化隱藏器缴阎,提高系統(tǒng)的性能
5.索引需要占物理和數(shù)據(jù)空間
什么是事務(wù)蛮拔?
事務(wù)(Transaction)是并發(fā)控制的基本單位建炫。所謂的事務(wù)疼蛾,它是一個(gè)操作序列衍慎,這些操作要么都執(zhí)行稳捆,要么都不執(zhí)行眷柔,它是一個(gè)不可分割的工作單位驯嘱。事務(wù)是數(shù)據(jù)庫(kù)維護(hù)數(shù)據(jù)一致性的單位,在每個(gè)事務(wù)結(jié)束時(shí)剃幌,都能保持?jǐn)?shù)據(jù)一致性晾浴。
mysql底層實(shí)現(xiàn)原理
你能說(shuō)一下數(shù)據(jù)庫(kù)的主外關(guān)聯(lián)嗎负乡?以及它有什么特性呢?
mysql鎖機(jī)制
實(shí)踐中如何優(yōu)化MySQL
① SQL語(yǔ)句及索引的優(yōu)化
② 數(shù)據(jù)庫(kù)表結(jié)構(gòu)的優(yōu)化
③ 系統(tǒng)配置的優(yōu)化
④ 硬件的優(yōu)化
在MySQL中如何定為查詢效率較慢的SQL語(yǔ)句
什么情況下設(shè)置了索引但無(wú)法使用
① 以“%”開(kāi)頭的LIKE語(yǔ)句脊凰,模糊匹配
② OR語(yǔ)句前后沒(méi)有同時(shí)使用索引
③ 數(shù)據(jù)類型出現(xiàn)隱式轉(zhuǎn)化(如varchar不加單引號(hào)的話可能會(huì)自動(dòng)轉(zhuǎn)換為int型)
MySQL的常見(jiàn)優(yōu)化方式抖棘、定為慢查詢
數(shù)據(jù)庫(kù)在使用的時(shí)候是如何進(jìn)行優(yōu)化的
數(shù)據(jù)庫(kù) SQL 問(wèn)題,寫(xiě)了幾條聯(lián)結(jié)查詢的語(yǔ)句狸涌,然后分析索引的使用原理之類的
SQL語(yǔ)句的優(yōu)化
order by要怎么處理
alter盡量將多次合并為一次
insert和delete也需要合并
等等
索引的底層實(shí)現(xiàn)原理和優(yōu)化
B+樹(shù)切省,經(jīng)過(guò)優(yōu)化的B+樹(shù)
主要是在所有的葉子結(jié)點(diǎn)中增加了指向下一個(gè)葉子節(jié)點(diǎn)的指針,因此InnoDB建議為大部分表使用默認(rèn)自增的主鍵作為主索引帕胆。
觸發(fā)器是如何使用的懒豹,觸發(fā)器有什么優(yōu)點(diǎn)和缺點(diǎn),通常有什么作用
數(shù)據(jù)庫(kù)里面的視圖
觸發(fā)器和函數(shù)的區(qū)別是什么
說(shuō)說(shuō)數(shù)據(jù)庫(kù)的索引在你項(xiàng)目里面是怎么使用的
有哪些索引,它們底層是采用什么數(shù)據(jù)結(jié)構(gòu)去實(shí)現(xiàn)的
B樹(shù)和B+樹(shù)的區(qū)別在哪里
其實(shí)二者最主要的區(qū)別是:
(1) B+樹(shù)改進(jìn)了B樹(shù), 讓內(nèi)結(jié)點(diǎn)只作索引使用, 去掉了其中指向data record的指針, 使得每個(gè)結(jié)點(diǎn)中能夠存放更多的key, 因此能有更大的出度. 這有什么用? 這樣就意味著存放同樣多的key, 樹(shù)的層高能進(jìn)一步被壓縮, 使得檢索的時(shí)間更短.
(2)當(dāng)然了,由于底部的葉子結(jié)點(diǎn)是鏈表形式, 因此也可以實(shí)現(xiàn)更方便的順序遍歷, 但是這是比較次要的, 最主要的的還是第(1)點(diǎn).
數(shù)據(jù)庫(kù)中表與類的關(guān)系钠怯,如何存儲(chǔ)對(duì)象
mysql架構(gòu)(連接池宁脊、查詢器坐漏、優(yōu)化器躏筏、緩沖器等)
數(shù)據(jù)庫(kù)引擎類型與差別
MyISAM是MySQL的默認(rèn)存儲(chǔ)引擎碴卧,基于傳統(tǒng)的ISAM類型,支持全文搜索,但不是事務(wù)安全的,而且不支持外鍵。每張MyISAM表存放在三個(gè)文件中:frm 文件存放表格定義;數(shù)據(jù)文件是MYD (MYData);索引文件是MYI (MYIndex)纫谅。
InnoDB是事務(wù)型引擎发魄,支持回滾苹粟、崩潰恢復(fù)能力苛秕、多版本并發(fā)控制店煞、ACID事務(wù)鸣个,支持行級(jí)鎖定(InnoDB表的行鎖不是絕對(duì)的阁将,如果在執(zhí)行一個(gè)SQL語(yǔ)句時(shí)MySQL不能確定要掃描的范圍,InnoDB表同樣會(huì)鎖全表,如like操作時(shí)的SQL語(yǔ)句)帅刀,以及提供與Oracle類型一致的不加鎖讀取方式。InnoDB存儲(chǔ)它的表和索引在一個(gè)表空間中,表空間可以包含數(shù)個(gè)文件。
主要區(qū)別:
MyISAM是非事務(wù)安全型的彬向,而InnoDB是事務(wù)安全型的。
MyISAM鎖的粒度是表級(jí)等曼,而InnoDB支持行級(jí)鎖定里烦。
MyISAM支持全文類型索引,而InnoDB不支持全文索引禁谦。
MyISAM相對(duì)簡(jiǎn)單丧蘸,所以在效率上要優(yōu)于InnoDB力喷,小型應(yīng)用可以考慮使用MyISAM陈症。
MyISAM表是保存成文件的形式,在跨平臺(tái)的數(shù)據(jù)轉(zhuǎn)移中使用MyISAM存儲(chǔ)會(huì)省去不少的麻煩宣决。
InnoDB表比MyISAM表更安全,可以在保證數(shù)據(jù)不會(huì)丟失的情況下贤惯,切換非事務(wù)表到事務(wù)表(alter table tablename type=innodb)洼专。
應(yīng)用場(chǎng)景:
MyISAM管理非事務(wù)表。它提供高速存儲(chǔ)和檢索孵构,以及全文搜索能力屁商。如果應(yīng)用中需要執(zhí)行大量的SELECT查詢,那么MyISAM是更好的選擇颈墅。
InnoDB用于事務(wù)處理應(yīng)用程序蜡镶,具有眾多特性雾袱,包括ACID事務(wù)支持。如果應(yīng)用中需要執(zhí)行大量的INSERT或UPDATE操作帽哑,則應(yīng)該使用InnoDB谜酒,這樣可以提高多用戶并發(fā)操作的性能
數(shù)據(jù)庫(kù)索引類型
唯一索引和普通索引差別
數(shù)據(jù)庫(kù)的隔離級(jí)別,MySQL默認(rèn)用的哪一級(jí)
Mysql 存儲(chǔ)引擎以及差別
Mysql索引實(shí)現(xiàn)原理
數(shù)據(jù)庫(kù)索引什么時(shí)候出現(xiàn)失效
簡(jiǎn)單說(shuō)一說(shuō)drop妻枕、delete與truncate的區(qū)別
SQL中的drop僻族、delete、truncate都表示刪除屡谐,但是三者有一些差別
1述么、delete和truncate只刪除表的數(shù)據(jù)不刪除表的結(jié)構(gòu)
2、速度,一般來(lái)說(shuō): drop> truncate >delete
3愕掏、delete語(yǔ)句是dml,這個(gè)操作會(huì)放到rollback segement中,事務(wù)提交之后才生效;
如果有相應(yīng)的trigger,執(zhí)行的時(shí)候?qū)⒈挥|發(fā). truncate,drop是ddl, 操作立即生效,原數(shù)據(jù)不放到
rollback segment中,不能回滾. 操作不觸發(fā)trigger.
Mysql ACID具體
ACID — 數(shù)據(jù)庫(kù)事務(wù)正確執(zhí)行的四個(gè)基本要素
ACID度秘,指數(shù)據(jù)庫(kù)事務(wù)正確執(zhí)行的四個(gè)基本要素的縮寫(xiě)。
包含:原子性(Atomicity)饵撑、一致性(Consistency)剑梳、隔離性(Isolation)、持久性(Durability)滑潘。
一個(gè)支持事務(wù)(Transaction)中的數(shù)據(jù)庫(kù)系統(tǒng)垢乙,必需要具有這四種特性,否則在事務(wù)過(guò)程(Transaction processing)當(dāng)中無(wú)法保證數(shù)據(jù)的正確性语卤,交易過(guò)程極可能達(dá)不到交易追逮。
原子性:一個(gè)事務(wù)(Transaction)中的所有操作,要么全部完成粹舵,要么全部不完成钮孵,不會(huì)結(jié)束在中間某個(gè)環(huán)節(jié)。事務(wù)在執(zhí)行過(guò)程中發(fā)生錯(cuò)誤眼滤,會(huì)被回滾(Rollback)到事務(wù)開(kāi)始前的狀態(tài)巴席,就像這個(gè)事務(wù)從來(lái)沒(méi)有執(zhí)行過(guò)一樣。
一致性:在事務(wù)開(kāi)始之前和事務(wù)結(jié)束以后柠偶,數(shù)據(jù)庫(kù)的完整性沒(méi)有被破壞情妖。這表示寫(xiě)入的資料必須完全符合所有的默認(rèn)規(guī)則,這包含資料的精準(zhǔn)度诱担、串聯(lián)新以及后續(xù)數(shù)據(jù)庫(kù)可以自發(fā)性地完成預(yù)定的工作毡证。
隔離性:當(dāng)兩個(gè)或者多個(gè)事務(wù)并發(fā)訪問(wèn)(此處訪問(wèn)指查詢和修改的操作)數(shù)據(jù)庫(kù)的同一數(shù)據(jù)時(shí)所表現(xiàn)出的互相關(guān)系。事務(wù)隔離分為不同的級(jí)別蔫仙,包括讀為提交(Read uncommitted)料睛、讀提交(Read committed)、可重復(fù)讀(Repeatable read)和串行化(Serializable)。
持久性:在事務(wù)完成以后恤煞,該事務(wù)對(duì)數(shù)據(jù)庫(kù)所作的更改便持久地保存在數(shù)據(jù)庫(kù)之中屎勘,而且是完全的。
數(shù)據(jù)庫(kù)的隔離級(jí)別和傳播行為
一居扒、隔離級(jí)別
數(shù)據(jù)庫(kù)事務(wù)的隔離級(jí)別有4個(gè)概漱,由低到高依次為Read uncommitted、Read committed喜喂、Repeatable read瓤摧、Serializable,這四個(gè)級(jí)別可以逐個(gè)解決臟讀玉吁、不可重復(fù)讀照弥、幻讀這幾類問(wèn)題。
1. ISOLATION_READ_UNCOMMITTED:這是事務(wù)最低的隔離級(jí)別进副,它充許令外一個(gè)事務(wù)可以看到這個(gè)事務(wù)未提交的數(shù)據(jù)这揣。
這種隔離級(jí)別會(huì)產(chǎn)生臟讀,不可重復(fù)讀和幻像讀影斑。
2. ISOLATION_READ_COMMITTED:保證一個(gè)事務(wù)修改的數(shù)據(jù)提交后才能被另外一個(gè)事務(wù)讀取给赞。另外一個(gè)事務(wù)不能讀取該事務(wù)未提交的數(shù)據(jù)
3. ISOLATION_REPEATABLE_READ:這種事務(wù)隔離級(jí)別可以防止臟讀,不可重復(fù)讀矫户。但是可能出現(xiàn)幻像讀塞俱。
它除了保證一個(gè)事務(wù)不能讀取另一個(gè)事務(wù)未提交的數(shù)據(jù)外,還保證了避免下面的情況產(chǎn)生(不可重復(fù)讀)吏垮。
4. ISOLATION_SERIALIZABLE:這是花費(fèi)最高代價(jià)但是最可靠的事務(wù)隔離級(jí)別。事務(wù)被處理為順序執(zhí)行罐旗。
除了防止臟讀膳汪,不可重復(fù)讀外,還避免了幻像讀九秀。
第1級(jí)別:Read Uncommitted(讀取未提交內(nèi)容)
(1)所有事務(wù)都可以看到其他未提交事務(wù)的執(zhí)行結(jié)果
(2)本隔離級(jí)別很少用于實(shí)際應(yīng)用遗嗽,因?yàn)樗男阅芤膊槐绕渌?jí)別好多少
(3)該級(jí)別引發(fā)的問(wèn)題是——臟讀(Dirty Read):讀取到了未提交的數(shù)據(jù)
第2級(jí)別:Read Committed(讀取提交內(nèi)容)
(1)這是大多數(shù)數(shù)據(jù)庫(kù)系統(tǒng)的默認(rèn)隔離級(jí)別(但不是MySQL默認(rèn)的)
(2)它滿足了隔離的簡(jiǎn)單定義:一個(gè)事務(wù)只能看見(jiàn)已經(jīng)提交事務(wù)所做的改變
(3)這種隔離級(jí)別出現(xiàn)的問(wèn)題是——不可重復(fù)讀(Nonrepeatable Read):不可重復(fù)讀意味著我們?cè)谕粋€(gè)事務(wù)中執(zhí)行完全相同的select語(yǔ)句時(shí)可能看到不一樣的結(jié)果。
|——>導(dǎo)致這種情況的原因可能有:(1)有一個(gè)交叉的事務(wù)有新的commit鼓蜒,導(dǎo)致了數(shù)據(jù)的改變;(2)一個(gè)數(shù)據(jù)庫(kù)被多個(gè)實(shí)例操作時(shí),同一事務(wù)的其他實(shí)例在該實(shí)例處理其間可能會(huì)有新的commit
第3級(jí)別:Repeatable Read(可重讀)
(1)這是MySQL的默認(rèn)事務(wù)隔離級(jí)別
(2)它確保同一事務(wù)的多個(gè)實(shí)例在并發(fā)讀取數(shù)據(jù)時(shí)痹换,會(huì)看到同樣的數(shù)據(jù)行
(3)此級(jí)別可能出現(xiàn)的問(wèn)題——幻讀(Phantom Read):當(dāng)用戶讀取某一范圍的數(shù)據(jù)行時(shí),另一個(gè)事務(wù)又在該范圍內(nèi)插入了新行都弹,當(dāng)用戶再讀取該范圍的數(shù)據(jù)行時(shí)娇豫,會(huì)發(fā)現(xiàn)有新的“幻影” 行
(4)InnoDB和Falcon存儲(chǔ)引擎通過(guò)多版本并發(fā)控制(MVCC,Multiversion Concurrency Control)機(jī)制解決了該問(wèn)題
第4級(jí)別:Serializable(可串行化)
(1)這是最高的隔離級(jí)別
(2)它通過(guò)強(qiáng)制事務(wù)排序畅厢,使之不可能相互沖突冯痢,從而解決幻讀問(wèn)題。簡(jiǎn)言之,它是在每個(gè)讀的數(shù)據(jù)行上加上共享鎖。
(3)在這個(gè)級(jí)別浦楣,可能導(dǎo)致大量的超時(shí)現(xiàn)象和鎖競(jìng)爭(zhēng)
?臟讀:一個(gè)事務(wù)讀到另一事務(wù)未提交的更新數(shù)據(jù)袖肥。
?不可重復(fù)讀:一個(gè)事務(wù)讀到另一事務(wù)已提交的更新數(shù)據(jù)。
?幻讀:一個(gè)事務(wù)讀到另一事務(wù)已提交的新插入的數(shù)據(jù)振劳。
事務(wù)具有ACID四種特性椎组。
但是Isolation并發(fā)可能引起如下問(wèn)題:
1.臟讀
允許讀取到未提交的臟數(shù)據(jù)。
2.不可重復(fù)讀
如果你在時(shí)間點(diǎn)T1讀取了一些記錄历恐,在T2時(shí)再想重新讀取一次同樣的這些記錄時(shí)寸癌,這些記錄可能已經(jīng)被改變、或者消失不見(jiàn)夹供。
3.幻讀
解決了不重復(fù)讀灵份,保證了同一個(gè)事務(wù)里,查詢的結(jié)果都是事務(wù)開(kāi)始時(shí)的狀態(tài)(一致性)哮洽。但是填渠,如果另一個(gè)事務(wù)同時(shí)提交了新數(shù)據(jù),本事務(wù)再更新時(shí)鸟辅,就會(huì)“驚奇的”發(fā)現(xiàn)了這些新數(shù)據(jù)氛什,貌似之前讀到的數(shù)據(jù)是“鬼影”一樣的幻覺(jué)。
由ANSI/ISO定義的SQL-92標(biāo)準(zhǔn)定義的四種隔離級(jí)別
1.Read Uncommitted
2.Read Committed
3.Repeatable Read
4.Serializable
二匪凉、傳播行為
1枪眉、PROPAGATION_REQUIRED:如果當(dāng)前沒(méi)有事務(wù),就創(chuàng)建一個(gè)新事務(wù)再层,如果當(dāng)前存在事務(wù)贸铜,就加入該事務(wù),該設(shè)置是最常用的設(shè)置聂受。
2蒿秦、PROPAGATION_SUPPORTS:支持當(dāng)前事務(wù),如果當(dāng)前存在事務(wù)蛋济,就加入該事務(wù)棍鳖,如果當(dāng)前不存在事務(wù),就以非事務(wù)執(zhí)行碗旅《纱Γ‘
3、PROPAGATION_MANDATORY:支持當(dāng)前事務(wù)祟辟,如果當(dāng)前存在事務(wù)医瘫,就加入該事務(wù),如果當(dāng)前不存在事務(wù)旧困,就拋出異常登下。
4茫孔、PROPAGATION_REQUIRES_NEW:創(chuàng)建新事務(wù),無(wú)論當(dāng)前存不存在事務(wù)被芳,都創(chuàng)建新事務(wù)缰贝。
5、PROPAGATION_NOT_SUPPORTED:以非事務(wù)方式執(zhí)行操作畔濒,如果當(dāng)前存在事務(wù)剩晴,就把當(dāng)前事務(wù)掛起。
6侵状、PROPAGATION_NEVER:以非事務(wù)方式執(zhí)行赞弥,如果當(dāng)前存在事務(wù),則拋出異常趣兄。
7绽左、PROPAGATION_NESTED:如果當(dāng)前存在事務(wù),則在嵌套事務(wù)內(nèi)執(zhí)行艇潭。如果當(dāng)前沒(méi)有事務(wù)拼窥,則執(zhí)行與PROPAGATION_REQUIRED類似的操作。
隔離級(jí)別蹋凝,隔離級(jí)別如何實(shí)現(xiàn)
MySQL有哪些索引
索引的優(yōu)缺點(diǎn) 什么時(shí)候索引不起作用鲁纠? 在什么地方可以使用索引?
B+樹(shù)索引與哈希索引有什么區(qū)別
innodb和myisam區(qū)別鳍寂,B+樹(shù)性質(zhì)改含,多列索引及最左前綴原則和其他使用場(chǎng)景
MyISAM 和 InnoDB的適用場(chǎng)景
MyISAM適合:(1)做很多count 的計(jì)算;(2)插入不頻繁迄汛,查詢非常頻繁捍壤;(3)沒(méi)有事務(wù)。
InnoDB適合:(1)可靠性要求比較高鞍爱,或者要求事務(wù)白群;(2)表更新和查詢都相當(dāng)?shù)念l繁,并且表鎖定的機(jī)會(huì)比較大的情況硬霍。
MyISAM 和 InnoDB的區(qū)別
1)MyISAM類型不支持事務(wù)處理等高級(jí)處理,而InnoDB類型支持
2)myisam表不支持外鍵
3)在執(zhí)行數(shù)據(jù)庫(kù)寫(xiě)入的操作(insert,update,delete)的時(shí)候笼裳,myisam表會(huì)鎖表唯卖,而innodb表會(huì)鎖行
4)當(dāng)你的數(shù)據(jù)庫(kù)有大量的寫(xiě)入、更新操作而查詢比較少或者數(shù)據(jù)完整性要求比較高的時(shí)候就選擇innodb表躬柬。當(dāng)你的數(shù)據(jù)庫(kù)主要以查詢?yōu)橹靼莨欤啾容^而言更新和寫(xiě) 入比較少,并且業(yè)務(wù)方面數(shù)據(jù)完整性要求不那么嚴(yán)格允青,就選擇myisam表橄碾。因?yàn)閙yisam表的查詢操作效率和速度都比innodb要快。
兩種存儲(chǔ)引擎在索引以及鎖機(jī)制上的實(shí)現(xiàn)方式的區(qū)別,limit offset優(yōu)化法牲,B+樹(shù)及其查找過(guò)程
數(shù)據(jù)庫(kù)基本知識(shí)(存取控制史汗、觸發(fā)器、存儲(chǔ)過(guò)程(了解作用)拒垃、游標(biāo)(了解作用)
并發(fā)控制(并發(fā)數(shù)據(jù)不一致性停撞、事務(wù)隔離級(jí)別、樂(lè)觀鎖與悲觀鎖等)
說(shuō)一下數(shù)據(jù)庫(kù)事務(wù)的四個(gè)特性悼瓮,為什么mysql事務(wù)能保證失敗回滾
數(shù)據(jù)庫(kù)的第一戈毒、第二、第三范式
1NF: 字段是最小的的單元不可再分
2NF:滿足1NF,表中的字段必須完全依賴于全部主鍵而非部分主鍵 (一般我們都會(huì)做到)
3NF:滿足2NF,非主鍵外的所有字段必須互不依賴(不能互相推導(dǎo))
4NF:滿足3NF,消除表中的多值依賴
冗余舉個(gè)例子
mysql:索引横堡,事務(wù)隔離級(jí)別埋市,組合索引在什么情況下失效
mysql數(shù)據(jù)庫(kù)的鎖有多少種,怎么編寫(xiě)加鎖的sql語(yǔ)句
mysql什么情況下會(huì)觸發(fā)表鎖
mysql中索引失效的情況
mysql 索引原理命贴。為什么索引一部分放到內(nèi)存道宅,一部分放到硬盤(pán)上?
現(xiàn)在有一個(gè)很多個(gè)表進(jìn)行關(guān)聯(lián)查詢的sql套么,子表的數(shù)據(jù)非常的多培己,那么請(qǐng)問(wèn)你僅僅從sql的角度去進(jìn)行sql語(yǔ)句的優(yōu)化,不需要考慮索引胚泌、謂詞
現(xiàn)在有10億條數(shù)據(jù)的一張表省咨,請(qǐng)你設(shè)計(jì)一種方案快速的將這些表中的數(shù)據(jù)搬遷到另一個(gè)數(shù)據(jù)庫(kù)中
數(shù)據(jù)庫(kù)同步你做過(guò)哪些方案,各有什么優(yōu)缺點(diǎn)
現(xiàn)在有兩張表(記不太清楚了)玷室,問(wèn)怎么查詢才能保證查詢效率最高
頁(yè)鎖零蓉、樂(lè)觀鎖、悲觀鎖
數(shù)據(jù)庫(kù)的悲觀鎖和樂(lè)觀鎖
悲觀鎖:對(duì)數(shù)據(jù)被外界(包括本系統(tǒng)當(dāng)前的其他事務(wù)穷缤,以及來(lái)自外部系統(tǒng)的事務(wù)處理)修改持保守態(tài)度敌蜂,因此,在整個(gè)數(shù)據(jù)處理過(guò)程中津肛,將數(shù)據(jù)處于鎖定狀態(tài)章喉。悲觀鎖的實(shí)現(xiàn),往往依靠數(shù)據(jù)庫(kù)提供的鎖機(jī)制(也只有數(shù)據(jù)庫(kù)層提供的鎖機(jī)制才能真正保證數(shù)據(jù)訪問(wèn)的排他性身坐,否則秸脱,即使在本系統(tǒng)中實(shí)現(xiàn)了加鎖機(jī)制,也無(wú)法保證外部系 統(tǒng)不會(huì)修改數(shù)據(jù))部蛇。
樂(lè)觀鎖:大多是基于數(shù)據(jù)版本( Version )記錄機(jī)制實(shí)現(xiàn)摊唇。何謂數(shù)據(jù)版本?即為數(shù)據(jù)增加一個(gè)版本標(biāo)識(shí)涯鲁,在基于數(shù)據(jù)庫(kù)表的版本解決方案中巷查,一般是通過(guò)為數(shù)據(jù)庫(kù)表增加一個(gè) “version” 字段來(lái)實(shí)現(xiàn)有序。讀取出數(shù)據(jù)時(shí),將此版本號(hào)一同讀出岛请,之后更新時(shí)旭寿,對(duì)此版本號(hào)加一。此時(shí)髓需,將提交數(shù)據(jù)的版本數(shù)據(jù)與數(shù)據(jù)庫(kù)表對(duì)應(yīng)記錄的當(dāng)前版本信息進(jìn)行比對(duì)许师,如果提交的數(shù)據(jù)版本號(hào)大于數(shù)據(jù)庫(kù)表當(dāng)前版本號(hào),則予以更新僚匆,否則認(rèn)為是過(guò)期數(shù)據(jù)微渠。
數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS)中的并發(fā)控制的任務(wù)是確保在多個(gè)事務(wù)同時(shí)存取數(shù)據(jù)庫(kù)中同一數(shù)據(jù)時(shí)不破壞事務(wù)的隔離性和統(tǒng)一性以及數(shù)據(jù)庫(kù)的統(tǒng)一性。
樂(lè)觀并發(fā)控制(樂(lè)觀鎖)和悲觀并發(fā)控制(悲觀鎖)是并發(fā)控制主要采用的技術(shù)手段咧擂。
悲觀鎖:假定會(huì)發(fā)生并發(fā)沖突逞盆,屏蔽一切可能違反數(shù)據(jù)完整性的操作
樂(lè)觀鎖:假設(shè)不會(huì)發(fā)生并發(fā)沖突,只在提交操作時(shí)檢查是否違反數(shù)據(jù)完整性松申。
數(shù)據(jù)庫(kù)設(shè)計(jì)云芦,假如做一個(gè)通信錄,每個(gè)用戶可能有多個(gè)聯(lián)系方式(比如有微信贸桶,qq舅逸,facebook,人人等皇筛,每個(gè)用戶可能全有琉历,可能也只有其中 一部分,后面也看新增類似字段)水醋。如果每個(gè)字段給一列旗笔,這樣活很浪費(fèi),問(wèn)這么設(shè)計(jì)表拄踪。
方案有兩種:
(1)另外單獨(dú)設(shè)計(jì)一張表蝇恶,外鍵關(guān)聯(lián)到用戶表,里面有一個(gè)類型字段標(biāo)識(shí)是微信還是qq還是facebook等惶桐,第二個(gè)字段是賬號(hào)內(nèi)容
(2)直接放在用戶表中撮弧,設(shè)計(jì)一個(gè)字段存放一個(gè)json數(shù)據(jù),json格式為{“微信”:xxxx姚糊, qq:“xxx"....}