新聞中心
隨著數(shù)據(jù)庫(kù)技術(shù)的不斷發(fā)展,對(duì)數(shù)據(jù)的操作越來(lái)越頻繁,對(duì)數(shù)據(jù)的安全性和一致性的要求也越來(lái)越高。為了保證數(shù)據(jù)的一致性,數(shù)據(jù)庫(kù)引入了鎖機(jī)制。鎖可以分為樂(lè)觀鎖和悲觀鎖兩種,其中悲觀鎖是最常用的一種鎖。在本文中,我們將介紹,以達(dá)到更好的數(shù)據(jù)保護(hù)結(jié)果。

創(chuàng)新互聯(lián)公司憑借專業(yè)的設(shè)計(jì)團(tuán)隊(duì)扎實(shí)的技術(shù)支持、優(yōu)質(zhì)高效的服務(wù)意識(shí)和豐厚的資源優(yōu)勢(shì),提供專業(yè)的網(wǎng)站策劃、成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、網(wǎng)站優(yōu)化、軟件開(kāi)發(fā)、網(wǎng)站改版等服務(wù),在成都10年的網(wǎng)站建設(shè)設(shè)計(jì)經(jīng)驗(yàn),為成都近1000家中小型企業(yè)策劃設(shè)計(jì)了網(wǎng)站。
什么是悲觀鎖
悲觀鎖是一種獨(dú)占鎖,它假設(shè)數(shù)據(jù)的并發(fā)訪問(wèn)量非常高,每當(dāng)一個(gè)事務(wù)想要訪問(wèn)某個(gè)數(shù)據(jù)時(shí),就會(huì)先把該數(shù)據(jù)加鎖,這樣,其他訪問(wèn)該數(shù)據(jù)的事務(wù)就需要等待該數(shù)據(jù)的鎖被釋放。在悲觀鎖的情況下,只允許一個(gè)事務(wù)對(duì)數(shù)據(jù)進(jìn)行更新,避免了數(shù)據(jù)的沖突和臟數(shù)據(jù)。
設(shè)置悲觀鎖的方法
數(shù)據(jù)庫(kù)中悲觀鎖的使用方法和實(shí)現(xiàn)方式有多種,其中最常用的方式是基于事務(wù)的悲觀鎖。在使用基于事務(wù)的悲觀鎖時(shí),我們可以使用select … for update語(yǔ)句將需要訪問(wèn)的數(shù)據(jù)加上悲觀鎖,該語(yǔ)句會(huì)鎖住所有訪問(wèn)該數(shù)據(jù)的記錄,直到某個(gè)事務(wù)完成為止。
以下是基于事務(wù)的悲觀鎖的實(shí)現(xiàn)代碼示例:
BEGIN;
SELECT * FROM table WHERE id = 1 FOR UPDATE;
UPDATE table SET name = ‘New Name’ WHERE id = 1;
COMMIT;
在這個(gè)實(shí)例中,我們首先使用BEGIN語(yǔ)句標(biāo)記一個(gè)事務(wù),然后在SELECT語(yǔ)句中使用FOR UPDATE將需要訪問(wèn)的數(shù)據(jù)加上悲觀鎖。在UPDATE語(yǔ)句中,我們對(duì)數(shù)據(jù)進(jìn)行了修改,最后使用COMMIT語(yǔ)句提交事務(wù)。
除了基于事務(wù)的悲觀鎖,我們還可以使用數(shù)據(jù)庫(kù)鎖機(jī)制來(lái)實(shí)現(xiàn)悲觀鎖。在數(shù)據(jù)庫(kù)鎖的實(shí)現(xiàn)中,我們可以對(duì)需要訪問(wèn)的數(shù)據(jù)行或列加鎖,在列鎖和行鎖的選擇上,需要根據(jù)具體的業(yè)務(wù)需求來(lái)決定。
如果需要加鎖的是某個(gè)列,我們可以使用FOR UPDATE關(guān)鍵字將該列加上悲觀鎖,以下是一個(gè)示例代碼:
SELECT name FROM table WHERE id = 1 FOR UPDATE;
在這個(gè)示例中,我們使用SELECT語(yǔ)句查詢了表中ID為1的記錄,同時(shí)使用FOR UPDATE將name列加上了悲觀鎖。這樣,當(dāng)其他事務(wù)嘗試訪問(wèn)該記錄時(shí),會(huì)被阻塞,直到該悲觀鎖被釋放。
如果需要加鎖的是某一行數(shù)據(jù),我們可以使用SELECT … FOR UPDATE語(yǔ)句加上悲觀鎖,以下是一個(gè)實(shí)例代碼:
SELECT * FROM table WHERE id = 1 FOR UPDATE;
在這個(gè)代碼示例中,我們使用SELECT … FOR UPDATE鎖定了ID為1的行數(shù)據(jù),這樣其他事務(wù)就無(wú)法對(duì)該行進(jìn)行更新操作。
悲觀鎖是一種常用的數(shù)據(jù)鎖技術(shù),在實(shí)際應(yīng)用場(chǎng)景中具有重要的作用。為了提高數(shù)據(jù)庫(kù)的數(shù)據(jù)保護(hù)效果,需要合理、準(zhǔn)確地應(yīng)用悲觀鎖技術(shù)。本文中,我們介紹了基于事務(wù)的悲觀鎖和數(shù)據(jù)庫(kù)鎖機(jī)制的悲觀鎖兩種實(shí)現(xiàn)方式,都是比較常用的實(shí)現(xiàn)方式。通過(guò)掌握這些實(shí)現(xiàn)方式,我們可以更加有效地對(duì)數(shù)據(jù)進(jìn)行保護(hù),確保數(shù)據(jù)的安全性和完整性。
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián)為您提供網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù)!
如何給oracle數(shù)據(jù)庫(kù)添加樂(lè)觀鎖
樂(lè)觀鎖一開(kāi)始也說(shuō)了,就是一開(kāi)始假設(shè)不會(huì)造成數(shù)據(jù)沖突,在最后提交的時(shí)候再冊(cè)信進(jìn)行數(shù)據(jù)沖突檢測(cè)。在樂(lè)觀鎖中,我們有3種
常用的做法來(lái)實(shí)現(xiàn)。
之一種就是在數(shù)據(jù)取得的時(shí)候把整個(gè)數(shù)據(jù)都copy到應(yīng)用中,在進(jìn)行提交的時(shí)候比對(duì)當(dāng)前數(shù)據(jù)庫(kù)中的數(shù)據(jù)和開(kāi)始的時(shí)候更新前取得的數(shù)據(jù)。當(dāng)發(fā)現(xiàn)兩個(gè)數(shù)據(jù)一模一樣以后,就表示沒(méi)有沖突可以提交,否則則是并發(fā)沖突,需要去用業(yè)務(wù)邏輯進(jìn)行解決。
第二種樂(lè)觀鎖的做法就是采用版本戳,這個(gè)在Hibernate中得到了使用。采用版本戳的話,首先需要在你有樂(lè)觀鎖的數(shù)據(jù)庫(kù)table上建立一個(gè)新的column,比如為number型,當(dāng)你數(shù)據(jù)每更新一次的時(shí)候,版本數(shù)就會(huì)往上增加1。比如同樣有2個(gè)session同樣對(duì)某條數(shù)據(jù)進(jìn)行操作。兩者都取到當(dāng)前的數(shù)據(jù)的版本號(hào)為1,當(dāng)之一個(gè)session進(jìn)行數(shù)據(jù)更新后,在提交的時(shí)候查看到當(dāng)前數(shù)據(jù)的版本還為1,和自己一開(kāi)始取到的版本相同。就正式提交,然后把版本號(hào)增加1,這個(gè)時(shí)候當(dāng)前數(shù)據(jù)的版本為2。當(dāng)?shù)诙€(gè)session也更新了數(shù)據(jù)提交的時(shí)候,發(fā)現(xiàn)數(shù)據(jù)庫(kù)中版本為2,和一開(kāi)始這個(gè)session取到的版本號(hào)不一致,就知道別人更新過(guò)此條數(shù)據(jù),這個(gè)
時(shí)候再進(jìn)行業(yè)務(wù)處理,比如整個(gè)Transaction都Rollback等等操作。在用版本戳的時(shí)候如姿升,可以在應(yīng)用程序側(cè)使用版本戳的驗(yàn)證,也可以在數(shù)據(jù)庫(kù)側(cè)采用Trigger(觸發(fā)器)來(lái)進(jìn)行驗(yàn)證。不過(guò)數(shù)據(jù)庫(kù)的Trigger的性能開(kāi)銷還是比較的大,所以能在應(yīng)用側(cè)進(jìn)行驗(yàn)證的話還是推薦不用Trigger。
第三種做法和第二種做法有點(diǎn)類似,就是也新增一個(gè)Table的Column,不過(guò)這次這個(gè)column是采用timestamp型,存儲(chǔ)渣老數(shù)據(jù)最后更新的時(shí)間。在Oracle9i以后可以采用新的數(shù)據(jù)類型,也就是timestamp with time zone類型來(lái)做時(shí)間戳。這種Timestamp的數(shù)據(jù)精度在Oracle的時(shí)間類型中是更高的,精確到微秒(還沒(méi)與到納秒的級(jí)別),一般來(lái)說(shuō),加上數(shù)據(jù)庫(kù)處理時(shí)間和人的思考動(dòng)作時(shí)間,微秒級(jí)別是非常非常夠了,其實(shí)只要精確到毫秒甚至秒都應(yīng)該沒(méi)有什么問(wèn)題。和剛才的版本戳類似,也是在更新提交的時(shí)候檢查當(dāng)前數(shù)據(jù)庫(kù)中數(shù)據(jù)的時(shí)間戳和自己更新前取到的時(shí)間戳進(jìn)行對(duì)比,如果一致則OK,否則就是版本沖突。如果不想把代碼寫在程序中或者由于別的原因無(wú)法把代碼寫在現(xiàn)有的程序中,也可以把這個(gè)時(shí)間戳樂(lè)觀鎖邏輯寫在Trigger或者存儲(chǔ)過(guò)程中。
synchronized是悲觀鎖嗎
你碰到這個(gè)問(wèn)題屬于多線程共享資源(余額)的問(wèn)肢則題,可以給使用資源加鎖的做禪饑滲法,悲觀鎖和樂(lè)觀鎖都可以實(shí)現(xiàn),悲觀鎖適用于并發(fā)壓力小的情況,樂(lè)觀鎖適用于并發(fā)壓力大的情況。具體概念可以百度查詢。在changeBalance的方法上加synchronized聲明是屬于悲觀鎖的做法,實(shí)際操作一般使用數(shù)據(jù)庫(kù)提供的鎖,余額是保存在數(shù)據(jù)庫(kù)中的,使用select for update來(lái)加悲觀鎖。樂(lè)觀鎖一般是在更新余額之前先查詢余額相關(guān)的版本,然后在事物操作要提交之前再查一次版本,將兩個(gè)版本比對(duì),如果相同說(shuō)明沒(méi)有其它線程賀脊或進(jìn)程更新過(guò)此資源,可以提交,提交過(guò)后版本更新,否則則回滾之前的操作,重新執(zhí)行此事物操作。實(shí)際操作過(guò)程中,鎖操作一般由數(shù)據(jù)庫(kù)提供支持,分布式系統(tǒng)中現(xiàn)在最常用的的是zookeeper。
關(guān)于怎么在數(shù)據(jù)庫(kù)上加悲觀鎖的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
創(chuàng)新互聯(lián)(cdcxhl.com)提供穩(wěn)定的云服務(wù)器,香港云服務(wù)器,BGP云服務(wù)器,雙線云服務(wù)器,高防云服務(wù)器,成都云服務(wù)器,服務(wù)器托管。精選鉅惠,歡迎咨詢:028-86922220。
文章標(biāo)題:學(xué)會(huì)數(shù)據(jù)庫(kù)悲觀鎖的設(shè)置方法(怎么在數(shù)據(jù)庫(kù)上加悲觀鎖)
分享URL:http://m.fisionsoft.com.cn/article/cosopje.html


咨詢
建站咨詢
