多執行緒併發訪問資料庫中不同記錄時應該採用什麼辦法?

時間 2021-05-29 23:19:24

1樓:劉鑫

ATM問題是資料庫使用(注意不是設計和實現)學習中會遇到的經典問題,很多教程都是以此引入事務功能的學習。

簡單的說就是鎖行然後開個事務,或者開個事務然後校驗。

2樓:taolei0628

這種系統標準的架構是通過MQ接收請求和返回應答,業務處理邏輯不需要額外的同步機制,靠資料庫事務解決就可以了。

優化效能的關鍵是控制業務處理的程序或執行緒的併發數量。

如果僅是個實驗性質的專案,可以不用MQ,用訊號量或者執行緒池來控制併發程度。

補充說明一下:

其實ATM系統的難點不在技術層面上,其交易流程設計才是關鍵,涉及交易的可靠性和安全性,需要考慮各種異常情況下的處理機制。

假如乙個人在ATM上取款的交易在伺服器端的賬戶系統中端扣款成功,但最終沒有成功的取到鈔票。那麼可能發生了哪些異常?針對每種異常該怎麼處理才能保證客戶的資金最終不會損失?

相對簡單的情況是同行本地取款,既ATM所屬單位和你的資金賬戶是同乙個城市/地區的同一家銀行。更複雜的情況是本地跨行取款、異地同行取款、異地跨行取款。你平時在ATM上取款時有沒有注意到機器上面的「銀聯」、「金融聯」、"深銀聯"等標誌,有沒有想去了解其背後的運作機制?

ATM取款其背後的系統沒那麼簡單,拿ATM取款當面試題去考乙個程式設計師,這個面試官也不見得對ATM取款有多少了解。

3樓:Xi Yang

瀉藥。我對資料庫不熟悉。但是無論如何,邏輯上總是這樣的:在同一時間,你只能有乙個程序/執行緒在寫。所以,它自然會成為瓶頸。

這種鎖機制,很有可能資料庫引擎本身已經做進去了:你就算關門放一堆執行緒/程序寫同乙個記錄,人家資料庫引擎也會同時只放乙個去寫。

當然,這與你的業務邏輯密切相關。比如你需要同時寫幾個記錄作為乙個完整的業務操作,那你有可能需要人工地先鎖上,等都寫完了再放開,以防有誰讀到寫了一半的狀態。

但是,仍然要注意,資料庫引擎本身應當提供了這種功能,甚至很有可能已經提供了完整事務的功能。你應當仔細閱讀資料庫引擎的說明,並且仔細考慮你的業務邏輯需要怎麼樣的鎖。

無論如何,簡單地使用執行緒鎖是不行的。你的讀寫衝突很有可能來自另乙個程序,你這個執行緒的鎖壓根管不到。

4樓:

基本的伺服器程式都要多程序同時執行,這時候就早已超越執行緒同步互斥量的問題了。

作為對軟狗深惡痛絕的匿名使用者甲表示請跪讀 vczh 答案並抄寫 20 遍,然後

以解決問題為目的:去跪讀你選用資料庫的 transaction 相關文件。如果選用的資料庫沒有 transaction 請換乙個資料庫,比如換 PostgreSQL。

以學習知識為目的:找本經典的講資料庫基礎的書,把 ACID 的部分,transaction 使用的部分讀完,然後是 OS 程序、執行緒同步、POSIX 檔案鎖、IPC 等一坨東西讀完……然後試著寫乙個最基本的 transaction server 吧。

spring mybatis每次訪問資料庫都要新建session?

vwater 我的也是每個對資料庫操作都建立sqlsession,系統跑兩天sqlsession就建立不出來了,導致系統每次查庫就卡死了,求解 使用了多資料來源加Druid 在系統第一次訪問的時候,讀庫就會很慢,然後再次重新整理的時候就沒有這個問題 每一次的查詢也會用到Mybatis頂層的SqlSe...

資料庫MVCC中,如何判斷併發事務能否Commit

雷鋒來了 org wiki Optimistic concurrency control事務提交的時候把該事務讀過和寫過的資料重讀一遍,看看看看這些資料是否被修改過,如果沒有被修改就可以提交 這裡可以分3個問題來回答 1.一條記錄的MVCC結構 entry 可以看作 key k1,注釋 txid為1...

如何用R訪問MySQL資料庫

LOWKEYCEO 老師,我發現很多情感文章都在強調降低需求感,難道喜歡乙個人也不能暴露自己的需求感嗎?道理很簡單,因為很多人都不知道需求感是什麼,也沒有搞清楚需求感為什麼會變高。這裡一次性跟大家講清楚,希望大家不要忘記。所謂的 需求感 並不是特指某一種行為,而是一種心態,我喜歡對方,我就要為他付出...