sql 事务锁表问题!
比如我有2个存储过程如下:第一个
[code=SQL][/code]
DECLARE id_cursor CURSOR FOR
select id from products where age>100
OPEN id_cursor
FETCH NEXT FROM id_cursor into @id
while(@@fetch_status=0)
begin
EXEC dbo.updateid @id
FETCH NEXT FROM id_cursor into @id
end
close id_cursor
第二个 updateid
[code=SQL][/code]
@id
SET NOCOUNT ON;
/*开启事务*/
BEGIN TRANSACTION
update dbo.products set Status = 0 where id=@id;
update dbo.name set name = 1 where productid=@id;
IF @@Error <> 0
BEGIN
ROLLBACK TRANSACTION
END
/*提交事务*/
COMMIT TRANSACTION
我先描述下:
第一个存储过程从表 products 获取一部分age>100的记录;
然后调用有事务的存储过程updateid;去update了两个表,其中一个就是表products ;
问题是:
1.我有没有可能,在升级过程中,本来有条记录age=101。碰巧在第一个存储过程中游标获取时还是101,但是未遍历到他时,别变更为了99;这样他会被第二个执行吗?
2.游标获取的数据,是怎么获取的?试一次获取想成临时表?然后遍历的?
3.第二个存储过程中!事务锁表的时间起止是什么?
------解决方案--------------------SQL code
http://www.aiyiweb.com/Dev/DB/MSSQL/2007/2007070259057.html
------解决方案--------------------
--#1.会被第二个执行
--#2.SQL SERVER 会将游标定义所选取出来的数据记录存放在一临时表内(建立在tempdb 数据库下)。对该游标的读取操作皆由临时表来应答
--#3.一个事务中,对象的锁会保持到从事务开始,一直到事务结束.
------解决方案--------------------
select * into products_temp from products
然后再用游标遍历products_temp
------解决方案--------------------
锁,好像分为表锁、行锁、全局锁什么的。
一般来说,更新的数据表没有主键,肯定是表锁,带来的问题是访问冲突。
一般的访问会有全局锁一说,也会带来访问冲突。
解决的方法有时会很简单,请看看帮助吧