1. 程式人生 > >處理大批量的並發

處理大批量的並發

取數 不知道 ins 方式 update 什麽 gui guid 行修改

如何處理大量數據並發操作

文件緩存,數據庫緩存,優化sql,數據分流,數據庫表的橫向和縱向劃分,優化代碼結構!

鎖述的概
一. 為什麽要引入鎖
多個用戶同時對數據庫的並發操作時會帶來以下數據不一致的問題:

丟失更新
A,B兩個用戶讀同一數據並進行修改,其中一個用戶的修改結果破壞了另一個修改的結果,比如訂票系統

臟讀
A用戶修改了數據,隨後B用戶又讀出該數據,但A用戶因為某些原因取消了對數據的修改,數據恢復原值,此時B得到的數據就與數據庫內的數據產生了不一致

不可重復讀
A用戶讀取數據,隨後B用戶讀出該數據並修改,此時A用戶再讀取數據時發現前後兩次的值不一致

並發控制的主要方法是封鎖,鎖就是在一段時間內禁止用戶做某些操作以避免產生數據不一致

我在博客堂上也看到不少有關並發控制的文章,我一直是推薦使用時間戳來解決的。
比如我們在SQL Server中的表中定義一個字段為timestamp類型的字段ts,這個字段的值不需要我們進行控制的。
在Insert與Update時,數據庫會自己進行ts值的更新,因此我們只要在Update時使用:
Update xxx where [email protected] and [email protected] 就可以了,根本不用考慮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則說明更新不成功。

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

處理大批量的並發