对不起,前两天没有上网,所以没有及时回答大家的问题。
to wanghu(不懂就是不懂):在select语句中指定锁类型,该锁会保持到由语句所处理的全部数据上的事务结束,所以我在select语句前加上了begin tran,在该事务没有回滚或提交前,select出来的记录都不会被其他进程操作,不会出现你感觉的问题。
当然使用你所说的对整个事务设置最高隔离级别,也是可以,但这种方式的并发级别很低,在编程时应尽量避免。
另外,回答shenxin(木头)的问题:
1。加锁时间不会很长,应该是毫秒级,在加锁时,其他的调用只有等待锁的释放,如果锁的时间很长,最后得到的错误提示是执行sql语句超时。超时时间在设置服务器时指定,可由程序对特定的操作指定特定的超时时间。
2。对整个事务设置最高隔离级别的语句是:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
with xlock是通知系统(如查询优化器)执行此语句使用排它加锁方式(默认时select只是不可写但可读的加锁方式)。
不过感觉这个还是不对,在select完毕之后与update之前其他进程有可能进入。
不如对整个事务设置最高隔离级别。或者利用单个update语句:
update yourtbl set flag=1 where flag=0
if @@rowcount>0
...