今年**、秒殺**出現的比較多,本文主要是針對秒殺型別的**網,它資料併發的可能性很大。如果不採用資料庫鎖的概念。使用者最終賣出的商品很有可能比預計的要多的多。(資料庫鎖的概念並不是解決這一問題的最好的辦法)多個使用者同時對資料庫的併發操作時會帶來以下資料不一致的問題:
丟失更新
a,b兩個使用者讀同一資料並進行修改,其中乙個使用者的修改結果破壞了另乙個修改的結果,比如訂票系統
髒讀a使用者修改了資料,隨後b使用者又讀出該資料,但a使用者因為某些原因取消了對資料的修改,資料恢復原值,此時b得到的資料就與資料庫內的資料產生了不一致
不可重複讀
a使用者讀取資料,隨後b使用者讀出該資料並修改,此時a使用者再讀取資料時發現前後兩次的值不一致
併發控制的主要方法是封鎖,鎖就是在一段時間內禁止使用者做某些操作以避免產生資料不一致
這次主要講解鎖的粒度 問題
鎖粒度是被封鎖目標的大小,封鎖粒度小則併發性高,但開銷大,封鎖粒度大則併發性低但開銷小
sql server支援的鎖粒度可以分為為行、頁、鍵、鍵範圍、索引、表或資料庫獲取鎖
資源 描述
rid 行識別符號。用於單獨鎖定表中的一行。
鍵 索引中的行鎖。用於保護可序列事務中的鍵範圍。
頁 8 千位元組 (kb) 的資料頁或索引頁。
擴充套件盤區 相鄰的八個資料頁或索引頁構成的一組。
表 包括所有資料和索引在內的整個表。
db 資料庫。
示例:1. 行所
create
table
temp(a
char(2
),b
char(2
),c
char(2),)
insert
into
temp
values ('
a1','
b1','c1'
)insert
into
temp
values ('
a2','
b2','c2'
)insert
into
temp
values ('
a3','
b3','c3'
)--增加更新鎖,持續30s
begin
tran
update
temp
with(rowlock) set a='a0
'where b='b1
'waitfor delay '
00:00:30
'commit
tran
select
*from
temp
--必須在等待30s後才能執行更新。但對於查詢沒有影響
update
temp
with(rowlock) set a='a0
'where b='b1
'2. 鎖定表
begin
tran
update
temp
with(tablock) set a='a0
'where b='b1
'waitfor delay '
00:00:30
'commit
tran
--此時更新表中的任何一行資料都必須等待30s。及整個表都被鎖定
update
temp
with(rowlock) set a='a0
'where b='b2
'
利用MongoEnigine避免髒資料的產生
mongoimport mongoimport h 111.231.92.176 29032 d spider u spider p spider.1qaz wsx authenticationdatabase spider c new topic type csv headerline file ...
資料庫避免髒讀,幻讀
一 髒讀 乙個事務讀取到了另外乙個事務沒有提交的資料 詳細解釋 髒讀就是指 當乙個事務正在訪問資料,並且對資料進行了修改,而這種修改還沒有提交到資料庫中,這時,另外乙個事務也訪問這個資料,然後使用了這個資料。因為這個資料是還沒有提交的資料,那麼另外乙個事務讀到的這個資料是髒資料,依據髒資料所做的操作...
MySQL InnoDB 如何避免髒讀
事務隔離級別 repeatable read 能避免髒讀 rr隔離級別下的隱患 幻讀,另外一篇文章的重點 必須提前了解 當前讀和快照讀的區別 mysql 的 innodb 會維護一系列不暴露給使用者的隱藏字段,其中有3個用於實現快照讀 非阻塞讀 undo log 實現了快照讀的資料結構。read v...