數(shù)據(jù)庫事物樂觀鎖和悲觀鎖 數(shù)據(jù)庫事物單個(gè)邏輯單元工作執(zhí)行的一系列操作,就是一些sql語句,也可以是多條,一個(gè)update操作就是一個(gè)事物。 事物具有四種特性 1.原子性 事物必須是原子工作單元,要么都執(zhí)行成功(也就是說所有的sql語句都執(zhí)行成功),要么都不
數(shù)據(jù)庫事物樂觀鎖和悲觀鎖
數(shù)據(jù)庫事物單個(gè)邏輯單元工作執(zhí)行的一系列操作,就是一些sql語句,也可以是多條,一個(gè)update操作就是一個(gè)事物。
事物具有四種特性
1.原子性
事物必須是原子工作單元,要么都執(zhí)行成功(也就是說所有的sql語句都執(zhí)行成功),要么都不執(zhí)行(所有的sql語句都不執(zhí)行)。
www.2cto.com
2. 一致性
事務(wù)在完成時(shí),必須使所有的數(shù)據(jù)都保持一致狀態(tài)。
3.隔離性
允許多個(gè)用戶對(duì)數(shù)據(jù)進(jìn)行并發(fā)訪問,而不破環(huán)數(shù)據(jù)的完整行和正確性,同時(shí),并發(fā)事物的修改必須與其他并發(fā)事物隔離,一般是通過加鎖實(shí)現(xiàn)。
4.持久性
事物完成后,數(shù)據(jù)必須永久的保存到數(shù)據(jù)庫中。
事物并發(fā)訪問如果不設(shè)置事物的隔離級(jí)別,就會(huì)帶來如下問題
1.臟讀 讀取了其他事物未提交的數(shù)據(jù),一個(gè)事物修改了某條數(shù)據(jù)還未提交,一個(gè)事物讀取了這條數(shù)據(jù),而修改的事物由于某種原因失敗會(huì)滾了,這個(gè)時(shí)候讀取事物就讀到了臟數(shù)據(jù)。
2.不可重復(fù)讀
一個(gè)事物兩次讀取某條數(shù)據(jù),但讀取的結(jié)果不一樣,在第二次讀取的時(shí)候其他實(shí)物修改了這條數(shù)據(jù)。
www.2cto.com
3.幻讀
一個(gè)事物兩次讀取,讀取到了其他事物插入到數(shù)據(jù)中的數(shù)據(jù)。
針對(duì)以上情況,數(shù)據(jù)庫提供了四種事物的隔離級(jí)別來解決事物并發(fā)帶來的問題。
1.讀未提交(read uncommited)
寫事物會(huì)阻塞寫事物,但不會(huì)阻塞讀取事物,因此不能解決讀取臟數(shù)據(jù),讀取事物不會(huì)阻塞其他事物,這中隔離級(jí)別不能解決上面任何問題。
2 讀已經(jīng)提交(read commited)
寫事物會(huì)阻塞寫事物和讀取事物,因此可以避免讀取臟數(shù)據(jù),但讀取事物不會(huì)阻塞寫事物,不能解決可重復(fù)度去的問題。
3 可重復(fù)讀(Repeatable read)
讀事物會(huì)阻塞寫事物和讀事物,因此可以重復(fù)讀,但其他事物可以進(jìn)行插入操作,不能解決幻讀的問題。
4 序列化(Serializable)
事物必須一個(gè)一個(gè)的執(zhí)行 ,可以解決上面的問題,但事物基本沒有并發(fā)性。
事物的并發(fā)控制
當(dāng)多個(gè)人并發(fā)修改同一條數(shù)據(jù)時(shí),必須實(shí)現(xiàn)一個(gè)控制系統(tǒng),使一個(gè)人的修改不會(huì)對(duì)其他人的修改造成負(fù)面影響。
樂觀鎖和悲觀鎖控制并發(fā)
1.樂觀鎖
樂觀的認(rèn)為其他用戶企圖訪問和更改你正在訪問的對(duì)象的概率很低,即使有,大不了從來一次,對(duì)在做一次的開銷不是很大的情況下,如果開銷很大則必須使用悲觀鎖.樂觀鎖的實(shí)現(xiàn)需要在程序中控制,可以通過加一個(gè)數(shù)據(jù)版本號(hào)來控制比如兩個(gè)事物都讀取了同一條記錄要進(jìn)行更新
Sql代碼
select * from person
select * from person
update person set name='xiaoming',version=version+1 where id='1'
and version=0;
這個(gè)更新語句會(huì)執(zhí)行失敗,因?yàn)檎也坏桨姹竞脼?的數(shù)據(jù),第一個(gè)事物已經(jīng)更新了
pdate person set name='xiaoming',version=version+1 where id='1'
and version=0;
www.2cto.com
如果實(shí)物的隔離級(jí)別設(shè)置為讀已提交,使用樂觀鎖并能解決可重復(fù)度,系統(tǒng)要允許不可重復(fù)讀取。
悲觀鎖
很悲觀的認(rèn)為其他用戶訪問和更改你正在訪問或修改的對(duì)象的概率和高,悲觀鎖的實(shí)現(xiàn)是通過加鎖來實(shí)現(xiàn)的,當(dāng)要更改數(shù)據(jù)前就加鎖,別的事物不能操作,sql語句如下
Sql代碼
select * from person for update
update person set name='ff' where id='1'
直到上面事物提交,才能釋放鎖,其他事物才能操作。悲觀鎖的并發(fā)性會(huì)降低。因此大多數(shù)情況下,使用樂觀鎖來實(shí)現(xiàn)并發(fā)修改。
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com