今天在sql2000中做了如下測試:
建立測試表table1,其中僅包含一個欄位 ID int
僅包括一條記錄:0
操作一、
然後同時在查詢分析器的兩個視窗中執行下如下語句:
declare @id int
set @id = ( select max(id) from table1 )
while @id < 20000
begin
set @id = @id + 1
insert into table1 ( id ) select @id
set @id = ( select max(id) from table1 )
end
目的在於測試當兩個使用者同時操作同一個表時的重複性操作
結果:共得到21868條資料,其中1868條重複,重複率竟高達10%
分析:原因在於未對動作陳述式進行任何的加鎖機制
操作二、
加上了交易處理
begin tran
declare @id int
set @id = ( select max(id) from table1 )
while @id < 20000
begin
set @id = @id + 1
insert into table1 ( id ) select @id
set @id = ( select max(id) from table1 )
end
commit tran
在兩個的視窗同時執行
結果:僅有一條記錄重複
操作三、
在事務的基礎上再添加鎖機制
begin tran
declare @id int
set @id = ( select max(id) from table1 )
while @id < 40000
begin
set @id = @id + 1
insert into table1 with (tablock) ( id ) select @id
set @id = ( select max(id) from table1 )
end
commit tran
結果:40000條資料無一重複