這是一個典型的“丟失更新”問題。通常的解決方式是提高隔離級別,或者為select加排他鎖。但我推薦下面這種方式,可以在sql server默認的隔離級別和鎖機制下解決問題。
成都創(chuàng)新互聯(lián)公司IDC提供業(yè)務:德陽服務器托管,成都服務器租用,德陽服務器托管,重慶服務器租用等四川省內主機托管與主機租用業(yè)務;數據中心含:雙線機房,BGP機房,電信機房,移動機房,聯(lián)通機房。
begin?tran
--注意:事務中的第一句必須是update
update?表名?set?id=id+1?where?...
--獲取原來的id值
declare?@id?int;
select?@id=id-1?from?表名?where?...
利用@id,進行相應操作
視情況commit?tran或rollback?tran
核心思路是調整語句順序,將update放到事務最開始,利用其排他鎖,阻塞其他并發(fā)事務,保證同一時間只有一個事務執(zhí)行。
如何實現(xiàn)多線程查詢Sqlserver庫
在后臺創(chuàng)建多個線程,訪問你對應的數據然后放在一個指定的對象里面。 JSP上異步不斷的發(fā)送請求向你存放數據的對象,返回數據后,放在JSP頁面里面。
一次性插入大量數據,只能使用循環(huán),
如:游標,while 循環(huán)語句
下面介紹While 循環(huán)插入數據,
SQL 代碼如下:
IF OBJECT_ID('dbo.Nums') IS NOT NULL
DROP TABLE dbo.Nums;
GO
CREATE TABLE dbo.Nums(n INT NOT NULL PRIMARY KEY);
DECLARE @max AS INT, @rc AS INT;
SET @max = 5000000;
SET @rc = 1;
INSERT INTO Nums VALUES(1);
WHILE @rc * 2 = @max
BEGIN
INSERT INTO dbo.Nums SELECT n + @rc FROM dbo.Nums;
SET @rc = @rc * 2;
END
INSERT INTO dbo.Nums SELECT n + @rc FROM dbo.Nums WHERE n + @rc = @max;
--以上函數取自Inside SQL Server 2005: T-SQL Query一書。
INSERT dbo.Sample SELECT n, RAND(CAST(NEWID() AS BINARY(16))) FROM Nums
mysql,sqlserver 支持多連接,也就是相當于多線程了。
sqlite,MDB,都不支持多線程的,只能單個單個操作。要想多線程使用這些數據庫,使用魚刺隊列吧,將要執(zhí)行的sql放到隊列里面,然后搞個時鐘不斷的檢測并執(zhí)行 隊列里面的sql