我在部落格堂上也看到不少有關併發控制的文章,我一直是推薦使用時間戳來解決的。
比如我們在SQL Server中的表中定義一個欄位為timestamp型別的欄位ts,這個欄位的值不需要我們進行控制的。
在Insert與Update時,資料庫會自己進行ts值的更新,因此我們只要在Update時使用:
Update xxx where key=@key and ts=@ts 就可以了,根本不用考慮ts裡的值更新。
Delete時也最好進行一下判斷,用這種方式是可以控制資料併發操作的。
只需要在Update與Delete時,判斷"影響條數"就可以知道更新是否成功。
這一點我想非常方便,但不是所有的資料庫都支援timestampr的,如在Access裡沒有timestamp欄位,我也不知道其他的資料庫是否都有類似的timestamp型別, 不管怎麼樣,我覺得我們不能完全信賴於資料庫的控制,而應該採用自設的控制機制,這樣可以適應系統的資料庫移值,下面我就介紹一下,在.NET下如何實現,自設的時間戳控制。
我們也同樣建一個欄位ts,定義為Varchar,長度在20以上即可,而且不允許為null,這樣比較合適。
我們應該採用什麼機制來生成隨時的或者說不可能會產生一樣的值,我推薦的是DateTime.Now.Ticks,這是一個12位的數字,由於在Update等更新時,資料庫會自動進行鎖定,所以不可能會在同一時間會有兩個一樣的操作執行,因此這就可以避免Ticks產生相同的值了。
或者也可以採用Guid值,也可以產生唯一值,但我覺得Guid值太大,可能會影響效率。
那好,在我們Insert時:Insert xxxx ts='221283747584' where key='1'
在Update時 Update xx set xxx ts='39383848593839' where key='1' and ts='111111111111' //假設取到的原值為'11111111111'
Delete類似上面的。
我們判斷影響條數,如果為0則說明更新不成功。
我相信上面的方法是簡單可行的。
我目前也遇到一個問題:如果是批量更新與批量刪除,如何進行併發控制呢?
由於批量更新時,不是一條記錄:Update xxx where Birthday='2004-2-1'之類的,會影響到N條資料,要進行併發控制就不那麼容易了。如果還是採用一條條判斷ts那是不現實的。
對於這種只能放棄併發控制嗎?
再談資料的併發處理
相關文章
- 海量資料的併發處理
- 使用資料庫處理併發可能導致的問題資料庫
- 關於資料庫事務併發的理解和處理資料庫
- Postgres併發處理
- MySQL 併發處理MySql
- 資料處理之欄位合併
- 【轉】從msql資料庫處理高併發商品超賣SQL資料庫
- 處理併發衝突
- 簡述高併發解決思路-如何處理海量資料(中)
- 我們來談下高併發和分散式中的冪等處理分散式
- Entity Framework Core中的併發處理Framework
- Go併發呼叫的超時處理Go
- SQLite 併發的四種處理方式SQLite
- 併發問題處理方式
- 升訊威線上客服系統的併發高效能資料處理技術:為多執行緒處理同步資料執行緒
- C# ThreadPool 分批處理資料,所有資料執行完再返回C#thread
- Python資料處理(二):處理 Excel 資料PythonExcel
- 處理高併發的一般思路
- 轉載:Java處理高併發量訪問的處理總結Java
- 聊聊介面最大併發處理數
- 前端優化之高併發處理前端優化
- 資料處理
- Go 併發 2.2:錯誤處理模式Go模式
- ElasticSearch 文件併發處理以及文件路由Elasticsearch路由
- 使用Fan-Out模式併發處理模式
- 併發處理規則最佳推薦
- Spring如何處理執行緒併發Spring執行緒
- 從併發程式設計到分散式系統-如何處理海量資料(上)程式設計分散式
- 談談RxSwift中的錯誤處理Swift
- 籠統的資料處理
- 處理json格式的資料JSON
- 下載資料的處理
- 如何提高伺服器的併發處理能力?硬核!伺服器
- Nginx實現高速併發處理的原理詳解Nginx
- Panda資料處理
- Excel 資料處理Excel
- python 處理資料Python
- springmvc 資料處理SpringMVC
- 資料預處理