1 如何锁一个表的某一行 A 连接中执行SET TRANSACTION ISOLATION LEVEL REPEATABLE READbegin transelect * from tablename with (rowlock) where id=3waitfor delay '00:00:05'commit tranB连接中如果执行update tablename set colname='10' where id=3 --则要等待5秒update tablename set colname='10' where id<>3 --可立即执行2 锁定数据库的一个表SELECT * FROM table WITH (HOLDLOCK) 注意: 锁定数据库的一个表的区别SELECT * FROM table WITH (HOLDLOCK) 其他事务可以读取表,但不能更新删除SELECT * FROM table WITH (TABLOCKX) 其他事务不能读取表,更新和删除
使用存储过程 根据页面提交的时间差和提交条件提交到服务器端 然后锁定 进行操作,解除锁定 这样做的前提就是你的数据量非常的大 不过也可以使用索引解决 或者单纯的使用 sql语句 update 'table' set '' where (select * from '' where ...) 不过既然数据比较大而且比较频繁建议使用索引
A 连接中执行SET TRANSACTION ISOLATION LEVEL REPEATABLE READbegin transelect * from tablename with (rowlock) where id=3waitfor delay '00:00:05'commit tranB连接中如果执行update tablename set colname='10' where id=3 --则要等待5秒update tablename set colname='10' where id<>3 --可立即执行2 锁定数据库的一个表SELECT * FROM table WITH (HOLDLOCK)
注意: 锁定数据库的一个表的区别SELECT * FROM table WITH (HOLDLOCK)
其他事务可以读取表,但不能更新删除SELECT * FROM table WITH (TABLOCKX)
其他事务不能读取表,更新和删除
根据页面提交的时间差和提交条件提交到服务器端
然后锁定
进行操作,解除锁定
这样做的前提就是你的数据量非常的大
不过也可以使用索引解决
或者单纯的使用 sql语句
update 'table' set '' where (select * from '' where ...)
不过既然数据比较大而且比较频繁建议使用索引
之所以会出现两次select到相同记录集是因为vs.net 2003变成多线程进行,以前2002时单线程就没这问题,现在初步决定采用多线程处理方式,并行20~100个线程,每线程只处理一条记录