重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这是一个典型的“丢失更新”问题。通常的解决方式是提高隔离级别,或者为select加排他锁。但我推荐下面这种方式,可以在sql server默认的隔离级别和锁机制下解决问题。
成都创新互联公司IDC提供业务:德阳服务器托管,成都服务器租用,德阳服务器托管,重庆服务器租用等四川省内主机托管与主机租用业务;数据中心含:双线机房,BGP机房,电信机房,移动机房,联通机房。
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放到事务最开始,利用其排他锁,阻塞其他并发事务,保证同一时间只有一个事务执行。
如何实现多线程查询Sqlserver库
在后台创建多个线程,访问你对应的数据然后放在一个指定的对象里面。 JSP上异步不断的发送请求向你存放数据的对象,返回数据后,放在JSP页面里面。
一次性插入大量数据,只能使用循环,
如:游标,while 循环语句
下面介绍While 循环插入数据,
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,都不支持多线程的,只能单个单个操作。要想多线程使用这些数据库,使用鱼刺队列吧,将要执行的sql放到队列里面,然后搞个时钟不断的检测并执行 队列里面的sql