再談資料的併發處理

2021-09-08 15:29:48 字數 1209 閱讀 6192

我在部落格堂上也看到不少有關併發控制的文章,我一直是推薦使用時間戳來解決的。

比如我們在sql server中的表中定義乙個欄位為timestamp型別的字段ts,這個欄位的值不需要我們進行控制的。

在insert與update時,資料庫會自己進行ts值的更新,因此我們只要在update時使用:

update *** 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 ***x ts='221283747584' where key='1' 

在update時 update xx set *** ts='39383848593839' where key='1' and ts='111111111111' //假設取到的原值為'11111111111'  

delete類似上面的。

我們判斷影響條數,如果為0則說明更新不成功。

我相信上面的方法是簡單可行的。

我目前也遇到乙個問題:如果是批量更新與批量刪除,如何進行併發控制呢?

由於批量更新時,不是一條記錄:update *** where birthday='2004-2-1'之類的,會影響到n條資料,要進行併發控制就不那麼容易了。如果還是採用一條條判斷ts那是不現實的。

對於這種只能放棄併發控制嗎?

再談資料的併發處理

比如我們在sql server中的表中定義乙個欄位為timestamp型別的字段ts,這個欄位的值不需要我們進行控制的。在insert與update時,資料庫會自己進行ts值的更新,因此我們只要在update時使用 update where key key and ts ts 就可以了,根本不用考慮...

再談IMU資料處理(濾波器)

本文開始前,先回答乙個問題。首先,筆者指出的是該模型下,意思是在上篇文章中設計的模型下得到的結果,不排除有更優秀的模型,能得到更佳的效能。卡爾曼濾波器得到的結果與模型密切相關,並不存在說只要是卡爾曼就一定比別的演算法好,還要看應用的場景是否受限 最後,之所以上次提出乙個卡爾曼的例子,也主要是其 簡單...

多執行緒併發處理資料的問題

在現在的專案中遇到的乙個問題。我所做的簡訊平台,原來只是單執行緒傳送簡訊的,但是由於公司的應用範圍的擴大,簡訊的傳送量成倍的增多,一批插入的簡訊量達到5w資料,如果按照以前的方式,傳送過程十分緩慢。因為我們所用的第三方簡訊提供商只提供給我們10個併發的限制,所以我們採用10條執行緒進行讀取。一次發1...