日期:2014-05-18  浏览次数:20495 次

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
------解决方案--------------------
锁,好像分为表锁、行锁、全局锁什么的。
一般来说,更新的数据表没有主键,肯定是表锁,带来的问题是访问冲突。
一般的访问会有全局锁一说,也会带来访问冲突。
解决的方法有时会很简单,请看看帮助吧