資料庫併發時如何保證資料的正確性?

時間 2021-05-11 13:25:33

1樓:冀利鐲

select 編號,稱號,sum(數量)[算計]from table1

group by 編號,稱號由於併發操作帶來了資料的不一致性:

主要有三種:

1 丟失修改

2 不可重複讀

3 讀「髒」資料併發操控確保了事務的一致性原子性阻隔性持續性打個比方說,賣火車票,這時候火車票就剩餘一張了,可是同時有3個人要買這張票,你說如果不操控併發的話,3個火車票銷售點都收了顧客的錢,那麼這張票給誰呢

2樓:

看了描述大概明白題主困惑是什麼了。

題主應該是誤以為,由begin,增刪改查語句,commit組成的才叫事務。其實一般這種叫事務塊。我原來也有這種誤解。

而沒有begin,end包圍的單獨的每條語句也都是事務(如果開了自動提交的話,而在很多資料庫裡預設都開,比如題主說的mysql)。

再就是寫衝突問題。併發寫的時候,單機資料庫一般就是加鎖,像mysql,分布式的多會用樂觀提交,先寫,提交的時候發現衝突了再回滾。

3樓:徐辰

回答這個問題之前你需要定義什麼是「正確性」。

乙個簡單的例子,假如K是乙個key,初始值v0,client1把K設為v1,client2併發地把K設為v2,此時你認為對於client3來說「正確」的K值應該是:

A. v0

B. v1

C. v2

D. v1和v2中先/後發生的那乙個

E. v0、v1、v2都可以

選好了「正確性」的定義才能說如何保證它。

4樓:地山

Transaction 是資料庫發明的概念,幫助使用者透明的解決concurrency control的問題。你不用transaction,就要自己寫演算法保證資料的一致性,這就違背了使用資料庫的初衷。當然你不一定非要用資料庫。

除了加鎖,還有別的concurrency control的方法,比如可以耍流氓說我不要strong consistency(阿拉伯智者說,那山不來,就朝那山走去,印度智者說,需求達不到,就打滾改變需求。他們都是人類共同的導師。),但是加鎖是通用方案。

查了一下,這個innodb用的是mvcc,所以讀寫是可以做到互相不排斥的(但是我猜鎖也是一定存在的,比如資料庫的內容可以不加鎖,難道index也不加鎖?)。所以這個系統裡加transaction不一定等於加鎖。

mvcc的細節可以自己搜尋。

資料庫的選擇?

破緊逼 推薦學習oracle,因為sqlserver還是做了比較多的封裝,但是oracle會比較複雜,概念也比較多,能學到比較多的資料庫細節,之後學其他資料庫就游刃有餘 postgres django,在搬瓦工買個vps,3.99刀用一年。資料庫遷移沒什麼難度,django提供了 URL routi...

如何避免資料庫不響應導致資料庫執行緒池和業務執行緒池全部掛起?

資料庫讀寫執行緒做超時,哪怕非同步了,堵住了沒有超時一樣會死。再用個守護執行緒去檢測這些排隊的情況,一旦超出閾值就報警吧。在一般業務併發處理中,能丟擲主業務就丟擲主業務,讓主業務能最大併發處理。當然如果在主業務中資料庫響應很慢,而且持續時間很長,那麼無論執行緒池中多少個執行緒 執行緒無線多也不是什麼...

Arcgis建立的個人資料庫和檔案資料庫有什麼區別呢?

xomap Personal GDB 檔案實質是Access庫,檔案大小最大2G。File GDB則沒有檔案大小上線,且可以跨平台。 補充,gdb可以使用gdal驅動中的filegdb api進行簡單讀寫 相同 均為GeoDatabase資料模型的實現,均為物件導向的地理資料庫,不開源 不同 個人地...